题目就不放了
P1908 逆序对 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
这个题目使用树状数组,但是要加离散化,否则过不了。
举个例子:30000 10 400000 200.
其实就是:3 1 4 2
代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
ll c[500001],b[500001];
pair<ll,ll> a[500001];
inline int lowbit(int x){
return x&-x;
}
inline void add(int x){
while(x<=n){
++c[x];
x+=lowbit(x);
}
return;
}
inline int sum(int x){
int s=0;
while(x){
s+=c[x];
x-=lowbit(x);
}
return s;
}
int main(){
ios::sync_with_stdio(0);
cin>>n;
int i;
ll s=0;
for(i=1;i<=n;++i){
cin>>a[i].first;
a[i].second=i;
}
sort(a+1,a+n+1);
for(i=1;i<=n;++i)
b[a[i].second]=i;
for(i=n;i;--i)
s+=sum(b[i]),add(b[i]);
cout<<s;
}