洛谷 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
",1LL*n*(n-1)/2-ans);
29     return 0;
30 }
View Code
原文地址:https://www.cnblogs.com/DriverLao/p/9307343.html