树状数组+离散化求逆序对

编程入门 行业动态 更新时间:2024-10-19 08:54:54

树状数组+离散化求逆序

求逆序对是一个静态的问题,我们需要将静态转化为动态。即一边插入一边统计逆序对的个数。每一次把一个新的a[i]放入的时候,通过树状数组查询出已经存在的数中比它大的数的个数,并且可以肯定这些比它大的数一定是在a[i]前面的,一定构成逆序对。所以树状数组是用来统计每个数出现的次数。

两个公式

i - query(a[i]) 可以得到比a[i]大的数的个数。
query(a[i]) - mp[a[i]] 可以得到比a[i]小的个数。 这里mp[a[i]]表示离散化之后a[i]有几个。

代码

#include <bits/stdc++.h>
using namespace std;
#define int long long 
const int N = 1e5+10;
int a[N], c[N];vector<int> v;//离散化
map<int, int> p;
int n;int query(int x)
{int res = 0;for(; x ;x -= x & (-x)) res += c[x];return res;
}void insert(int x)
{for(;x <= n;x += x&(-x)) c[x] ++;
}signed main()
{cin >> n;for(int i = 1; i <= n; i ++){cin >> a[i];v.push_back(a[i]);}// 离散化sort(v.begin(),v.end());v.erase(unique(v.begin(),v.end()),v.end());for(int i = 0; i < v.size(); i ++){p[v[i]] = i + 1;}int ans = 0;for(int i = 1; i <= n; i ++){insert(p[a[i]]);// 累加结果即可ans += i - query(p[a[i]]);}cout << ans << endl;return 0;
}

更多推荐

逆序,树状,数组

本文发布于:2023-05-28 06:56:30,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/315126.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:逆序   树状   数组

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!