hdu 1394 Minimum Inversion Number

http://acm.hdu.edu.cn/showproblem.php?pid=1394

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #define maxn 50000
 5 using namespace std;
 6 
 7 struct node
 8 {
 9     int l,r;
10     int ans;
11 }tree[maxn*4];
12 
13 void build(int i,int l,int r)
14 {
15     tree[i].l=l;tree[i].r=r;
16     tree[i].ans=0;
17     if(l==r) return ;
18     int mid=(l+r)>>1;
19     build(i<<1,l,mid);
20     build(i<<1|1,mid+1,r);
21 }
22 
23 int search1(int i,int l,int r)
24 {
25     if(tree[i].l==l&&tree[i].r==r)
26     {
27         return tree[i].ans;
28     }
29     int mid=(tree[i].l+tree[i].r)>>1;
30     if(r<=mid)
31     {
32         return search1(i<<1,l,r);
33     }
34     else if(l>mid)
35     {
36         return search1(i<<1|1,l,r);
37     }
38     else
39     {
40         return search1(i<<1,l,mid)+search1(i<<1|1,mid+1,r);
41     }
42 }
43 
44 void update(int i,int c)
45 {
46     tree[i].ans++;
47     if(tree[i].l==tree[i].r) return ;
48     int mid=(tree[i].l+tree[i].r)>>1;
49     if(c<=mid)
50     {
51         update(i<<1,c);
52     }
53     else
54     {
55         update(i<<1|1,c);
56     }
57 }
58 
59 int main()
60 {
61     int a[maxn],n;
62     while(scanf("%d",&n)!=EOF)
63     {
64         build(1,0,n-1);
65         int sum=0;
66         for(int i=1; i<=n; i++)
67         {
68             scanf("%d",&a[i]);
69             sum+=search1(1,a[i],n-1);
70             update(1,a[i]);
71         }
72         int cc=sum;
73         for(int i=1; i<=n; i++)
74         {
75             sum+=(-a[i]+n-a[i]-1);
76             cc=min(cc,sum);
77         }
78         printf("%d\n",cc);
79     }
80     return 0;
81 }
View Code

 

posted @ 2014-03-03 20:57  null1019  阅读(145)  评论(0编辑  收藏  举报