【樹狀陣列】 洛谷1908 逆序對
阿新 • • 發佈:2018-12-24
題目:逆序對
思路:
很久前寫的權值線段樹,因為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;
}