题目:逆序对
思路:
很久前写的权值线段树,因为luogu的数据更新了,不再保证每个数不相等,所以不能AC了。
然后又用树状数组做了一遍,感觉要更适用一些。
代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 500000
#define read(x) scanf("%d",&x)
#define lowbit(x) (x&-x)
struct Pair {
int x,y;
Pair(){}
Pair(int xx,int yy) {x=xx,y=yy;}
bool operator < (const Pair& oth) const {
return x<oth.x;
}
};
int n;
int a[maxn+5];
Pair mp[maxn+5];
int b[maxn+5];
void add(int x) {
while(x<=n) {
b[x]++;
x+=lowbit(x);
}
}
int find(int x) {
int s=0;
while(x>0) {
s+=b[x];
x-=lowbit(x);
}
return s;
}
int main() {
read(n);
for(int i=1;i<=n;i++) read(a[i]),mp[i]=Pair(a[i],i);
int cc=0;
sort(mp+1,mp+n+1);
for(int i=1;i<=n;i++) {
if(mp[i].x!=mp[i-1].x) cc++;
a[mp[i].y]=cc;
}
long long ans=0;
for(int i=n;i>=1;i--) {
ans+=find(a[i]-1);
add(a[i]);
}
printf("%lld",ans);
return 0;
}