hdu1394 Minimum Inversion Number
有点思考难度 主要是用线段树求逆序对 利用线段树保存区间和的性质
#include<stdio.h> #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define maxn 5555 int n,x[maxn],sum[maxn],add=0; int Pushup(int rt) { sum[rt]=sum[rt<<1]+sum[rt<<1|1]; } int build(int l,int r,int rt) { int m=0; if(l==r) {sum[rt]=0;return 0;} m=(l+r)>>1; build(lson); build(rson); Pushup(rt); } int query(int L,int R,int l,int r,int rt) { int m,temp=0; if(L<=l&&r<=R) return sum[rt]; m=(l+r)>>1; if(L<=m) temp+=query(L,R,lson); if(m<R) temp+=query(L,R,rson); return temp; } int updata(int q,int l,int r,int rt) { int m; if(l==r) {sum[rt]++;return 0;} m=(l+r)>>1; if(q<=m) updata(q,lson); else updata(q,rson); Pushup(rt); } int main() { freopen("hdu1394.in","r",stdin); freopen("hdu1394.out","w",stdout); int i,ans; while(scanf("%d",&n)==1) { build(0,n-1,1);add=0; for(i=1;i<=n;i++) { scanf("%d",&x[i]); add=add+query(x[i]+1,n-1,0,n-1,1); updata(x[i],0,n-1,1); } ans=add; for(i=1;i<=n;i++) { add+=-x[i]+n-1-x[i]; ans=ans<add?ans:add; } printf("%d\n",ans); } return 0; }