逆序对
2025-08-04 13:41:40
发布于:上海
8阅读
0回复
0点赞
这也能用归并做,不过有另一道题,这里就先用树状数组
#include<iostream>
#include<algorithm>
using namespace std;
const int N=5e5+5;
typedef long long ll;
struct num{
int x,id;
}a[N];
ll c[N],n,m,ans;
int lowbit(int x){
return x & (-x);
}
void update(int x,int v){
while(x<=n){
c[x]+=v;
x+=lowbit(x);
}
}
ll sum(int x){
ll ans=0;
while(x>0){
ans+=c[x];
x-=lowbit(x);
}
return ans;
}
bool cmp(num a,num b){
if(a.x!=b.x)return a.x>b.x;
return a.id>b.id;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].x;
a[i].id=i;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++){
update(a[i].id,1);
ans+=sum(a[i].id-1);//防止记录到自己,所以-1
}
cout<<ans;
return 0;
}
这里空空如也
有帮助,赞一个