hdu1394 线段树点修改区间求和

 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

posted on 2014-07-24 19:47  xiao_xin  阅读(123)  评论(0编辑  收藏  举报

导航