1 #include<stdio.h>
2 #include<string.h>
3 #include<math.h>
4 #include<algorithm>
5 using namespace std;
6 int p,v,ql,qr,fsum,sumv[10005],d[10005],a[10005];
7 void update(int o,int l,int r)
8 {
9 int mid=l+(r-l)/2;
10 if (l==r) sumv[o]=v;
11 else{
12 if (p<=mid) update(o*2,l,mid);
13 else update(o*2+1,mid+1,r);
14 sumv[o]=sumv[o*2]+sumv[o*2+1];
15 }
16 }
17 void query(int o,int l,int r)
18 {
19 int mid=l+(r-l)/2;
20 if (ql<=l&&r<=qr) fsum+=sumv[o];
21 else{
22 if (ql<=mid) query(o*2,l,mid);
23 if (mid<qr) query(o*2+1,mid+1,r);
24 }
25 }
26 int main()
27 {
28 int n,i,k,ans,temp;
29 while (~scanf("%d",&n))
30 {
31 for (i=1;i<=n;i++)
32 {
33 scanf("%d",&k);
34 a[i]=k+1;
35 }
36 memset(sumv,0,sizeof(sumv));
37 ans=0;
38 for (i=1;i<=n;i++)
39 {
40 fsum=0;
41 p=a[i]; v=1; update(1,1,n);
42 ql=a[i]+1; qr=n;
43 if (ql<=qr) query(1,1,n);
44 ans+=fsum;
45 }
46 d[0]=ans;
47 for (i=1;i<=n;i++)
48 {
49 fsum=0; ql=1; qr=a[i]-1;
50 if (ql<=qr) query(1,1,n); temp=fsum;
51 fsum=0; ql=a[i]+1; qr=n;
52 if (ql<=qr) query(1,1,n);
53 d[i]=d[i-1]-temp+fsum;
54 ans=min(ans,d[i]);
55 }
56 printf("%d\n",ans);
57 }
58 }
http://acm.hdu.edu.cn/showproblem.php?pid=1394