逆数对(树状数组的方法)

ops/2024/9/23 20:13:06/

本题链接:登录—专业IT笔试面试备考平台_牛客网

题目:

样例:

输入
5
4 5 1 3 2

输出
7

思路:

        根据题意,求逆序对总数。

        逆序对含义:如果数组中的两个不同位置,前面的数字比后面的数字严格大,则称其为一个逆序对。

        根据样例已知: 4 5 1 3 2

        我们可以通过计数的方式,log(n)的时间复杂度获取逆序对。

        方式如下:

        每输入一个 x 后

        

00000
12...45

        就开始询问有多少个逆序对,求总和(x + 1 ~ INF) 的数量是多少。

        比如当输入到 1 的时候:

        

10011
12345

        逆序对的数量为:  sum(2 ~ INF) = 0 + 0 + 1 + 1 + 0 + ... + 0 = 2

        依此类推。

        这里利用到了树状数组(单点添加,区间查询)。操作函数看我以往的笔记。

        代码详解如下:

#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#define endl '\n'
#define int long long
#define YES puts("YES")
#define NO puts("NO")
#define umap unordered_map
#define All(x) x.begin(),x.end()
#pragma GCC optimize(3,"Ofast","inline")
#define IOS std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
using namespace std;
const int N = 2e6 + 10;
inline void solve();signed main()
{
//	freopen("a.txt", "r", stdin);IOS;int _t = 1;// cin >> _t;while (_t--){solve();}return 0;
}
int R = 100010;	// 题目 a[i] 的临界范围
int cnt[N];	// 用于计数
inline int lowbit(int x){return x&(-x);}
// 单点添加函数
inline void Add_pos(int pos,int x)
{for(int i = pos;i <= R;i += lowbit(i)) cnt[i] += x; 
}
// 区间询问函数	变相的获取逆序对
inline int ask(int l,int r)
{int ans = 0;for(int i = l - 1;i;i-=lowbit(i)) ans -= cnt[i];for(int i = r;i;i-=lowbit(i)) ans += cnt[i];return ans;
}
inline void solve()
{int n,x,ans = 0;cin >> n;while(n--){cin >> x;Add_pos(x,1); // 单点添加,统计ans += ask(x + 1,R);	// 询问总和,获取逆序对数量}cout << ans << endl;
}

  最后提交:


http://www.ppmy.cn/ops/21227.html

相关文章

FebHost:顶级域名、通用域名、国别域名注册介绍

在创建网站时&#xff0c;选择适当的顶级域名是至关重要的。顶级域名不仅有助于传播产品信息&#xff0c;还能提高受众的信任度和参与度&#xff0c;进而改善品牌记忆。 顶级域名有各种类型&#xff0c;每种都有其特定用途。最常见的两种顶级域是通用顶级域&#xff08;gTLD&a…

设计模式- 模板方法模式(Template Method Pattern) 结构|原理|优缺点|场景|示例

设计模式&#xff08;分类&#xff09; 设计模式&#xff08;六大原则&#xff09; 创建型&#xff08;5种&#xff09; 工厂方法 抽象工厂模式 单例模式 建造者模式 原型模式 结构型&#xff08;7种&#xff09; 适配器…

微信小程序详解

微信小程序是一种无需下载安装即可使用的应用&#xff0c;它实现了应用“触手可及”的梦想&#xff0c;用户只需扫一扫或搜索一下即可打开应用。微信小程序全面开放申请后&#xff0c;企业、政府、媒体、其他组织或个人开发者均可申请注册。 微信小程序的特点包括&#xff1a;…

Selenium web自动化测试环境搭建

Selenium web自动化环境搭建主要要经历以下几个步骤&#xff1a; 1、安装python 在python官网&#xff1a;Welcome to Python.org&#xff0c;根据各自对应平台如&#xff1a;windows&#xff0c;下载相应的python版本。 ​ 下载成功后&#xff0c;点击安装包&#xff0c;一直…

socket编程-----常用socket编程函数

操作系统&#xff1a;Linux 编程语言&#xff1a;C语言 简述&#xff1a;socket编程函数是socket编程中的基础&#xff0c;通过组合使用它们&#xff0c;可以实现各种网络通信功能。 socket编程函数较多&#xff0c;在这里只是列出较为常用的socket函数 socket()函数 socket()函…

二维码门楼牌管理应用平台建设:档案管理的新篇章

文章目录 前言一、二维码门楼牌管理应用平台的构建背景二、九小场所档案管理的重要性三、二维码门楼牌管理应用平台在九小场所档案管理中的应用四、二维码门楼牌管理应用平台的优势与挑战五、结语 前言 随着信息技术的飞速发展&#xff0c;二维码门楼牌管理应用平台的建设已成…

交通气象站监测站

TH-GQX8交通运输在人们的日常生活中扮演着越来越重要的角色。然而&#xff0c;气候变化、环境污染等因素对交通安全产生了极大的影响。为了应对这些挑战&#xff0c;交通气象站监测站应运而生&#xff0c;成为守护交通安全的重要利器。 一、交通气象站监测站的功能 交通气象站…

vue2使用过滤器实现菜单栏文字动态显示

文章目录 前言一、过滤器filters1.data数据2.beforeCreate 二、菜单栏文字动态显示 前言 左侧菜单栏有缩进&#xff0c;所以不同级别的菜单名可显示的文字数不同。顶部菜单栏是下拉框&#xff0c;所以文字是固定的 一、过滤器filters 由于filters不能使用this为undefined&…