用树状数组求逆序数 唯一的坑点就是sum要用long long存 直接贴代码了 以后忘了还能直接看 2333……
PS:和hdu3743代码是一样的,因为两个都是逆序对模版题……
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 using namespace std; 5 int s[500005]; 6 int N; 7 struct num{ 8 int xuhao,num; 9 }nu[500005]; 10 int qufan(int i){ 11 return i&(-i); 12 } 13 int cmp(num nu1,num nu2){ 14 return nu1.num<nu2.num; 15 } 16 int summ(int a){ 17 int sum=0; 18 while(a>0){ 19 sum+=s[a]; 20 a-=qufan(a); 21 } 22 return sum; 23 } 24 void haha(int n,int x){ 25 while(x<=n){ 26 s[x]++; 27 x+=qufan(x); 28 } 29 } 30 int main(){ 31 int n; 32 while(~scanf("%d",&n)&&n){ 33 for(int i=1;i<=n;i++){ 34 scanf("%d",&nu[i].num); 35 nu[i].xuhao=i; 36 } 37 sort(nu+1,nu+n+1,cmp); 38 long long sum=0; 39 for(int i=n;i>=1;i--){ 40 sum+=summ(nu[i].xuhao); 41 haha(n,nu[i].xuhao); 42 } 43 printf("%lld ",sum); 44 memset(s,0,sizeof(s)); 45 } 46 return 0; 47 }