标签:
Description
Input
Output
Sample Input
Sample Output
#include<stdio.h> #include<algorithm> #include<string.h> #define mid (L+R)/2 #define lson rt*2,L,mid #define rson rt*2+1,mid+1,R const int maxn=5500; int num[maxn*4]; void PushUP(int rt){ num[rt]=num[rt*2]+num[rt*2+1]; } void build(int rt,int L,int R){ num[rt]=0; if(L==R) return ; build(lson); build(rson); } int query(int rt,int L,int R,int l_ran,int r_ran){ if(l_ran<=L&&R<=r_ran){ return num[rt]; } int ret=0; if(l_ran<=mid){ ret+=query(lson,l_ran,r_ran); } if(r_ran>mid){ ret+=query(rson,l_ran,r_ran); } return ret; } void update(int rt,int L,int R,int pos){ if(L==R){ num[rt]++; return ; } if(pos<=mid){ update(lson,pos); } if(pos>mid){ update(rson,pos); } PushUP(rt); } int main(){ int n; while(scanf("%d",&n)!=EOF){ build(1,0,n-1); int sum=0; int a[5050]; for(int i=0;i<n;i++){ scanf("%d",&a[i]); int tmp=query(1,0,n-1,a[i],n-1); sum+=tmp; update(1,0,n-1,a[i]); } int ans=sum; for(int i=0;i<n;i++){ sum=sum+n-2*a[i]-1; if(ans>sum){ ans=sum; } } printf("%d\n",ans); } return 0; }
HDU 1394——Minimum Inversion Number——————【线段树单点增减、区间求和】
标签:
原文地址:http://www.cnblogs.com/chengsheng/p/4391982.html