400ms+,速度很快啊……
注意ans用long long 保存,不然会WA。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct node { int value; int pos; }a[500005]; int c[500005]; int b[500005]; int n; bool cmp(const node &a,const node &b) { return a.value<b.value; } int lowbit(int x) { return x&(-x); } int Sum(int end) { int sum=0; while(end>0) { sum+=c[end]; end=end-lowbit(end); } return sum; } void change(int i,int x) { while(i<=n) { c[i]=c[i]+x; i=i+lowbit(i); } } int main() { while(scanf("%d",&n)&&n) { long long ans=0; for(int i=1;i<=n;i++) { c[i]=0; scanf("%d",&a[i].value); a[i].pos=i; } sort(a+1,a+n+1,cmp); for(int i=1;i<=n;i++) { b[a[i].pos]=i; } for(int i=1;i<=n;i++) { change(b[i],1); ans+=(i-Sum(b[i])); } printf("%lld\n",ans); } return 0; }
作者:t1019256391 发表于2013-7-16 11:01:54 原文链接
阅读:49 评论:0 查看评论