标签:des style http os io for 数据 ar div
10 1 3 6 9 0 8 5 7 4 2
16
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define L(x) (x<<1) #define R(x) (x<<1|1) #define MID(x,y) ((x+y)>>1) using namespace std; #define N 5005 int a[N]; struct stud{ int le,ri; int va; }f[N*4]; void build(int pos,int le,int ri) { f[pos].le=le; f[pos].ri=ri; f[pos].va=0; if(le==ri) return ; int mid=MID(le,ri); build(L(pos),le,mid); build(R(pos),mid+1,ri); } void update(int pos,int le) { f[pos].va++; if(f[pos].le==le&&f[pos].ri==le) return ; int mid=MID(f[pos].le,f[pos].ri); if(mid>=le) update(L(pos),le); else update(R(pos),le); } int query(int pos,int le,int ri) { if(f[pos].le>=le&&f[pos].ri<=ri) return f[pos].va; int mid=MID(f[pos].le,f[pos].ri); if(mid>=ri) return query(L(pos),le,ri); else if(mid<le) return query(R(pos),le,ri); return query(L(pos),le,mid)+query(R(pos),mid+1,ri); } int main() { int n,m,i; while(~scanf("%d",&n)) { int ans=0; build(1,0,n); for(i=0;i<n;i++) { scanf("%d",&a[i]); ans+=query(1,a[i],n-1); update(1,a[i]); } int temp=ans; for(i=0;i<n;i++) { temp=temp-a[i]+n-a[i]-1; if(temp<ans) ans=temp; } printf("%d\n",ans); } return 0; }
HDU 1394 Minimum Inversion Number (线段树)
标签:des style http os io for 数据 ar div
原文地址:http://blog.csdn.net/u014737310/article/details/38756313