逆序对+离散化
#include<bits/stdc++.h> using namespace std; const int maxn=1e6+10; int a[maxn],c[maxn]; struct dd { int x,id; dd(int xx=0,int yy=0):x(xx),id(yy) { } bool operator <(const dd&aa)const { return x<aa.x; } }; dd b[maxn]; int lowbit(int x) { return x&(-x); } int n; int add(int x,int y) { for(int i=x; i<=1e6+10; i+=lowbit(i)) { c[i]+=y; } } long long ask(int x) { long long ans=0; for(int i=x; i>0; i-=lowbit(i)) ans+=c[i]; return ans; } int main() { // freopen("2.in","r",stdin); cin>>n; for(int i=1; i<=n; i++) { cin>>b[i].x; b[i].id=i; //cin>>a[i]; } sort(b+1,b+1+n); int now=0,nub=0; for(int i=1; i<=n; i++) { if(b[i].x!=nub) { now++; a[b[i].id]=now; nub=b[i].x; } else { a[b[i].id]=now; nub=b[i].x; } } long long ans=0; for(int i=n; i>=1; i--) { add(a[i],1); ans+=ask(a[i]-1); } printf("%lld\n",ans); //十年oi一场空,不开longlong见祖宗 return 0; }
记得输出也要用long long