首页 > 代码库 > HDU 1394
HDU 1394
如果求出第一种情况的逆序列,其他的可以通过递推来搞出来,一开始是t[1],t[2],t[3]....t[N]
它的逆序列个数是sum个,如果把t[1]放到t[N]后面,逆序列个数会减少t[1]个,相应会增加N-(t[1]+1)个
1 #include <cstdio> 2 #include <iostream> 3 using namespace std; 4 #define N 5005 5 int sum[N*4],a[N]; 6 void build(int l,int r,int root){ 7 sum[root]=0; 8 if(l==r)return ; 9 int mid=(l+r)/2;10 build(l,mid,root*2);11 build(mid+1,r,root*2+1);12 }13 void update(int x,int l,int r,int root){14 if(l==r){15 sum[root]++;16 return;17 }18 int mid=(l+r)/2;19 if(x<=mid)update(x,l,mid,root*2);20 else update(x,mid+1,r,root*2+1);21 sum[root]=sum[root*2]+sum[root*2+1];22 }23 int query(int x,int y,int l,int r,int root){24 if(x<=l&&y>=r){25 return sum[root];26 }27 int add=0,mid=(r+l)/2;28 if(x<=mid)add+=query(x,y,l,mid,root*2);29 if(y>mid)add+=query(x,y,mid+1,r,root*2+1);30 return add;31 }32 int main(){33 freopen("test.txt","r",stdin);34 int t,s;35 while(scanf("%d",&t)!=EOF){36 build(0,t-1,1);37 s=0;38 for(int i=0;i<t;i++){39 scanf("%d",&a[i]);40 s+=query(a[i],t-1,0,t-1,1);41 update(a[i],0,t-1,1);42 }43 int ret=s;44 for(int i=0;i<t;i++){45 s+=t-a[i]-1-a[i];46 ret=min(ret,s);47 }48 printf("%d\n",ret);49 }50 return 0;51 }
#include <cstdio>
#include <iostream>
using namespace std;
#define N 5005
int sum[N*4],a[N];
void build(int l,int r,int root){
sum[root]=0;
if(l==r)return ;
int mid=(l+r)/2;
build(l,mid,root*2);
build(mid+1,r,root*2+1);
}
void update(int x,int l,int r,int root){
if(l==r){
sum[root]++;
return;
}
int mid=(l+r)/2;
if(x<=mid)update(x,l,mid,root*2);
else update(x,mid+1,r,root*2+1);
sum[root]=sum[root*2]+sum[root*2+1];
}
int query(int x,int y,int l,int r,int root){
if(x<=l&&y>=r){
return sum[root];
}
int add=0,mid=(r+l)/2;
if(x<=mid)add+=query(x,y,l,mid,root*2);
if(y>mid)add+=query(x,y,mid+1,r,root*2+1);
return add;
}
int main(){
freopen("test.txt","r",stdin);
int t,s;
while(scanf("%d",&t)!=EOF){
build(0,t-1,1);
s=0;
for(int i=0;i<t;i++){
scanf("%d",&a[i]);
s+=query(a[i],t-1,0,t-1,1);
update(a[i],0,t-1,1);
}
int ret=s;
for(int i=0;i<t;i++){
s+=t-a[i]-1-a[i];
ret=min(ret,s);
}
printf("%d\n",ret);
}
return 0;
}