洛谷 1774 最接近神的人
【题解】
其实就是求逆序对。直接上树状数组就好了。
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #define LL long long 5 #define rg register 6 #define N 500010 7 using namespace std; 8 int n,m,n2,a[N],b[N],t[N]; 9 LL ans; 10 inline int read(){ 11 int k=0,f=1; char c=getchar(); 12 while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar(); 13 while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar(); 14 return k*f; 15 } 16 inline void add(int x){for(;x<=n2;x+=(x&-x)) t[x]++;} 17 inline int query(int x){int ret=0;for(;x>0;x-=(x&-x)) ret+=t[x]; return ret;} 18 int main(){ 19 n=read(); 20 for(rg int i=1;i<=n;i++) a[i]=b[i]=read(); 21 sort(b+1,b+1+n); n2=unique(b+1,b+1+n)-b-1; 22 for(rg int i=1;i<=n;i++) a[i]=lower_bound(b+1,b+1+n2,a[i])-b; 23 // for(rg int i=1;i<=n;i++) printf("%d ",a[i]); puts(""); 24 for(rg int i=1;i<=n;i++){ 25 ans+=query(a[i]); 26 add(a[i]); 27 } 28 printf("%lld\n",1LL*n*(n-1)/2-ans); 29 return 0; 30 }