hdu1394 Minimum Inversion Number
2012-07-15 10:12
239 查看
有点思考难度 主要是用线段树求逆序对 利用线段树保存区间和的性质
#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; }
相关文章推荐
- hdu 1394 Minimum Inversion Number
- HDU 1394 Minimum Inversion Number——线段树求逆序数
- HDU 1394 Minimum Inversion Number
- HDU 1394 Minimum Inversion Number(线段树 || 树状数组+逆序数 )
- hdu 1394 Minimum Inversion Number(成段更新)
- hdu 1394 Minimum Inversion Number 树状数组求逆序数对(原理)
- hdu 1394 Minimum Inversion Number(单点更新)
- HDU 1394 Minimum Inversion Number
- HDU 1394 Minimum Inversion Number
- hdu 1394 Minimum Inversion Number(数据结构:线段树)
- hdu 1394 Minimum Inversion Number(树状数组)
- hdu(1394)——Minimum Inversion Number
- 【线段树求逆序数】【HDU1394】Minimum Inversion Number
- 杭电hdu 1394 Minimum Inversion Number 线段树练习
- [hdu]1394 Minimum Inversion Number -- 暴力求逆序、树状数组求逆序、线段树求逆序、归并排序求逆序
- hdu 1394 Minimum Inversion Number(线段树 单点更新)
- Hdu 1394 Minimum Inversion Number、Poj 2299 Ultra-QuickSort
- HDU 1394 Minimum Inversion Number (线段树,单点更新)
- 线段树专辑——hdu 1394 Minimum Inversion Number
- hdu1394 Minimum Inversion Number