题解:本题主要考查树状数组求逆序对,先将数据按值的大小排序注意判重,再构建树状数组 代码如下:
#include<iostream> #include<algorithm> using namespace std; struct node { int num,v; }a[7346278]; int tree[2342345]; long long n,sum=0; int cmp(node a,node b) { if(a.v==b.v)return a.num<b.num; return a.v<b.v; } int lowbit(int k) { return k&-k; } void add(int x,int k) { while(x<=n) { tree[x]+=k; x+=lowbit(x); } } int search(int x) { int ans=0; while(x>0) { ans+=tree[x]; x-=lowbit(x); } return ans; } int main() { cin>>n; for(int i=1;i<=n;i++) {cin>>a[i].v;a[i].num=i;} sort(a,a+n+1,cmp); for(int i=1;i<=n;i++) { add(a[i].num,1); sum+=i-search(a[i].num); } cout<<sum; cin>>n; return 0; }