Time Limit: 7000MS | Memory Limit: 65536K | |
Total Submissions: 47014 | Accepted: 17182 |
Description
Input
Output
Sample Input
5 9 1 0 5 4 3 1 2 3 0
Sample Output
6 0
Source
题意:求按冒泡升序排序的交换次数。
题解:按顺序依次插入树状数组里,每次统计a[i]前面有多少个数,然后ans+=i-num;
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cstdlib> #include<cmath> #define N 5000010 #define ll long long using namespace std; int n; struct node { int x; int num; } a[N]; int bit[N]; bool cmp_1(node a,node b) { return a.x<b.x; } bool cmp_2(node a,node b) { return a.num<b.num; } int sum(int i) { int s=0; while(i>0) { s+=bit[i]; i-=i&-i; } return s; } void add(int i,int x) { while(i<=n) { bit[i]+=x; i+=i&-i; } } int main() { //freopen("test.in","r",stdin); while(cin>>n&&n) { for(int i=1; i<=n; i++) { scanf("%d",&a[i].x); a[i].num=i; } sort(a+1,a+n+1,cmp_1); for(int i=1; i<=n; i++)//离散化 a[i].x=i; sort(a+1,a+n+1,cmp_2); memset(bit,0,sizeof bit); ll ans=0; for(int i=1; i<=n; i++) { ans+=i-sum(a[i].x)-1; add(a[i].x,1); } printf("%lld\n",ans); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
POJ 2299 Ultra-QuickSort(树状数组)
原文地址:http://blog.csdn.net/acm_baihuzi/article/details/46810747