hdu2838Cow Sorting树状数组求逆序对
发布时间:2020-12-13 20:15:42 所属栏目:PHP教程 来源:网络整理
导读://对数列中的1个数,在它前面比它大的1定要和它交换 //在它后面比它小的1定得和它交换 //可以用树状数组存入每个数在它之前比它小的数的个数 //那末(i⑴)-total[i]为在它前面比它大的数的个数 //然后在所有数都存入树状数组后用getsum(num[i])可以求出全部数
//对数列中的1个数,在它前面比它大的1定要和它交换 //在它后面比它小的1定得和它交换 //可以用树状数组存入每个数在它之前比它小的数的个数 //那末(i⑴)-total[i]为在它前面比它大的数的个数 //然后在所有数都存入树状数组后用getsum(num[i])可以求出全部数列中比这个数小的数的个数 //那末getsum(num[i])⑴-total[i]则为在它以后比它小的数的个数 //ans+=num[i]*(i⑵+getsum(num[i])⑵*total[i]); #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn=100010; __int64 total[maxn]; int tree[maxn]; int num[maxn]; int lowbit(int i) { return (i&(-i)); } int getsum(int i) { int sum=0; while(i>0) { sum+=tree[i]; i-=lowbit(i); } return sum; } void update(int i,int dx) { while(i<maxn) { tree[i]+=dx; i+=lowbit(i); } } int main() { int n; while(scanf("%d",&n)!=EOF) { int a;int i; __int64 ans=0; memset(tree,sizeof(tree)); for(i=1;i<=n;i++) { scanf("%d",&a); num[i]=a; total[i]=getsum(a); update(a,1); } for(i=1;i<=n;i++) { ans+=num[i]*(i⑵+getsum(num[i])⑵*total[i]); } printf("%I64d ",ans); } return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |