一开始按照常规算法做,发现不行,因为可能导致树状数组空间开的太大999999999了都。参考了一下网上的答案,用到了所谓的离散化,我咋感觉和hash差不多。
这个博文把这个问题讲的特别详细了:http://wenku.baidu.com/link?url=AeZsivoojqQq74cwFq_58D6rL7cXXT0joHFMmYvWgY_U6VuNxyyzgyKYTl7maHcnPrbXhcQqL8_QI08G5Me-6D-kiXg2rm_K-4ObtD-Twom
下面自然而然贴出ac代码:
#include<string.h> #include<iostream> #include<stdio.h> #include<algorithm> using namespace std; const int M=500002; int cnt[M]; int dic[M]; class A { public: int val,id; }; A per[M]; bool cmp(A a, A b) { return a.val<b.val; } int lowbit(int x) { return x&(-x); } long long sum(int x) { long long s=0; while(x>0) { s+=cnt[x]; x-=lowbit(x); } return s; } void add(int x,int val) { while(x<=M) { cnt[x]+=val; x+=lowbit(x); } } int main() { int n; long long result; while(cin>>n,n) { int x,y; memset(cnt,0,sizeof(cnt)); memset(dic,0,sizeof(dic)); result=0; for(int i=1; i<=n; i++) { scanf("%d",&per[i].val); per[i].id=i; } sort(per+1,per+n+1,cmp); for(int m=1; m<=n; m++) dic[per[m].id]=m; for(int k=1; k<=n; k++) { add(dic[k],1); result+=k-sum(dic[k]); } printf("%lld\n",result); } return 0; }
原文地址:http://blog.csdn.net/lsgqjh/article/details/45950139