首页 > 代码库 > 求逆序对
求逆序对
方法一:树状数组
模板如下:
#include<iostream> #include<cstdio> #include <algorithm> using namespace std; const int MAXN=40001; int n, a[MAXN], tree[MAXN], tot; int lowbit(int x) { return x&-x; } int query(int x) { int ans=0; while (x>0) { ans+=tree[x]; x-=lowbit(x); } return ans; } void addz(int x) { while (x<=n) { tree[x]+=1; x+=lowbit(x); } return; } struct Node { int v, ord; bool operator < (const Node x) const { return v<x.v; } }node[MAXN]; int main() { scanf("%d", &n); for (int i=1; i<=n; i++) { scanf("%d", &node[i].v); node[i].ord=i; } sort(node+1, node+n+1 ); for (int i=1; i<=n; i++) a[node[i].ord]=i; for (int i=1; i<=n; i++) { addz(a[i]); tot+=i-query(a[i]); } printf("%d", tot); return 0; }
求逆序对
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。