标签:
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