poj2299——逆序对
题目:http://poj.org/problem?id=2299
逆序对,注意树状数组维护后缀和。
代码如下:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #define MAXN 500005 using namespace std; int n,f[MAXN]; long long da[MAXN],a[MAXN],ans; int query(int x) { int ret=0; for(;x<=n;x+=x&-x) ret+=f[x]; return ret; } void update(int x) { for(;x;x-=x&-x) f[x]++; } int main() { while(scanf("%d",&n)==1) { if(!n)return 0; ans=0; memset(f,0,sizeof f); for(int i=1;i<=n;i++) scanf("%lld",&da[i]),a[i]=da[i]; sort(da+1,da+n+1); unique(da+1,da+n+1); for(int i=1;i<=n;i++) a[i]=lower_bound(da+1,da+n+1,a[i])-da; for(int i=1;i<=n;i++) { ans+=query(a[i]); update(a[i]); } printf("%lld ",ans); } return 0; }