hdoj 3743
题目大意:就是逆序数
解决:树状数组+离散化,以后再也不会让题目给骗了,题目上并没有说是有多组测试数据,一直wa,不知道怎么回事,以为算法出问题了呢,但是可以运行一会时间,却原来是因为有多组测试数据,以后要注意,无论是若题目没有明确说明是一组,就按照多组来。顺便有练习下树状数组的离散化过程,其实和前边的的超快速排序没什么不一样,但是这次是从另一个角度出发的,统计出这个数出现之前所有比这个数大的数的个数,就是需要交换的次数了。
#include <iostream> #include <algorithm> using namespace std; const int N=1000000; #define LL __int64 struct node { int id; int val; }; node c[N+5]; int a[N+5]; int m[N+5]; bool operator <(const node& a,const node&b) { return a.val < b.val; } inline int lowbit(int x) { return x&(-x); } void update(int p,int delta) { for(int i=p;i>0;i-=lowbit(i)) m[i]+=delta; } int getsum(int p) { int res=0; for(int i=p;i<=N;i+=lowbit(i)) res+=m[i]; return res; } int main() { int n,t; while(scanf("%d",&n)!=EOF) { for(int i=1;i<=n;i++) { scanf("%d",&c[i].val); c[i].id=i; } sort(c+1,c+n+1); for(int i=1;i<=n;i++) a[c[i].id]=i; LL cnt=0; for(int i=1;i<=n;i++) { cnt+=getsum(a[i]+1); update(a[i],1); } printf("%I64d\n",cnt); memset(m,0,sizeof(m)); } system("pause"); return 0; }