简单单点更新线段树

 简单线段树

hdu1166

 1 #include<stdio.h>
 2 #define lson l,m,rt<<1
 3 #define rson m+1,r,rt<<1|1
 4 #define maxn 50505
 5 int sum[maxn<<2];
 6 void PushUP(int rt)
 7 {
 8     sum[rt] = sum[rt<<1] + sum[rt<<1|1];
 9 }
10 void build(int l,int r,int rt)
11 {
12     if(l == r)
13     {
14         scanf("%d",&sum[rt]);
15         return;
16     }
17     int m = (l + r)/2;
18     build(lson);
19     build(rson);
20     PushUP(rt);
21 }
22 void Updata(int p,int add,int l,int r,int rt)
23 {
24     if(l == r)
25     {
26         sum[rt] += add;
27         return ;
28     }
29     int m = (l + r)/2;
30     if(p <= m)
31         Updata(p,add,lson);
32     else 
33         Updata(p,add,rson);
34     PushUP(rt);
35 }
36 int Query(int L,int R,int l,int r,int rt)
37 {
38     if(L <= l&&r <= R)
39         return sum[rt];
40     int ret = 0;
41     int m = (l + r)/2;
42     if(L > m)
43         ret += Query(L,R,rson);
44     else if(m >= R)
45         ret += Query(L,R,lson);
46     else
47     {
48         ret += Query(L,R,lson);
49         ret += Query(L,R,rson);
50     }
51     return ret;
52 }
53 int main()
54 {
55     int T , ff = 0 , n;
56     scanf("%d",&T);
57     while(T--)
58     {
59         printf("Case %d:\n",++ff);
60         scanf("%d",&n);
61         build(1,n,1);
62         char s[10];
63         while(scanf("%s",s)!=EOF)
64         {
65             if(s[0]=='E')
66                 break;
67             int a,b;
68             scanf("%d%d",&a,&b);
69             if(s[0]=='A')
70                 Updata(a,b,1,n,1);
71             else if(s[0]=='S')
72                 Updata(a,-b,1,n,1);
73             else if(s[0]=='Q')
74                 printf("%d\n",Query(a,b,1,n,1));
75         }
76     }
77 }
View Code

hdu1394

 1 #include<stdio.h>
 2 #define lson l,m,rt<<1
 3 #define rson m+1,r,rt<<1|1
 4 #define maxn 5500
 5 int sum[maxn<<2];
 6 int a[maxn];
 7 void PushUp(int rt)
 8 {
 9     sum[rt]=sum[rt<<1]+sum[rt<<1|1];
10 }
11 void build(int l,int r,int rt)
12 {
13     sum[rt]=0;
14     if(l==r)
15         return;
16     int m=(l+r)/2;
17     build(lson);
18     build(rson);
19 }
20 int Query(int L,int R,int l,int r,int rt)
21 {
22     if(L<=l&&R>=r)
23         return sum[rt];
24     int m=(l+r)/2;
25     int ret=0;
26     if(m >= L)
27         ret+=Query(L,R,lson);
28     if(m < R)
29         ret+=Query(L,R,rson);
30     return ret;
31 }
32 void Updata(int p,int l,int r,int rt)
33 {
34     if(l==r)
35     {
36         sum[rt]++;
37         return;
38     }
39     int m=(r+l)/2;
40     if(m>=p)
41         Updata(p,lson);
42     else
43         Updata(p,rson);
44     PushUp(rt);
45 }
46 int main()
47 {
48     int i,n;
49     while(scanf("%d",&n)!=EOF)
50     {
51         build(1,n,1);
52         int ss=0;
53         for(i=0;i<n;i++)
54         {
55             scanf("%d",&a[i]);
56             ss+=Query(a[i],n-1,0,n-1,1);
57             Updata(a[i],0,n-1,1);
58         }
59         int ans=ss;
60         for(i=0;i<n;i++)
61         {
62             ans=ans+n-1-2*a[i];
63             if(ans<ss)
64                 ss=ans;
65         }
66         printf("%d\n",ss);
67     }
68 }
View Code

hdu2795

 1 #include<stdio.h>
 2 #define lson l,m,rt<<1
 3 #define rson m+1,r,rt<<1|1
 4 #define maxn 202002
 5 int sum[maxn<<2];
 6 int max(int x,int y)
 7 {
 8     return x>y?x:y;
 9 }
10 void PushUp(int rt)
11 {
12     sum[rt]=max(sum[rt<<1],sum[rt<<1|1]);
13 }
14 void build(int l,int r,int rt,int v)
15 {    
16     sum[rt]=v;
17     if(l==r)
18     {
19         return;
20     }
21     int m=(l+r)/2;
22     build(lson,v);
23     build(rson,v);
24 //    PushUp(rt);
25 }
26 int Query(int len,int l,int r,int rt)
27 {
28     if(len>sum[rt])
29         return -1;
30     if(l==r)
31     {
32         sum[rt]-=len;
33         return l;
34     }
35     int ret;
36     int m=(l+r)/2;
37     if(len<=sum[rt<<1])
38         ret =  Query(len,lson);
39     else if(len<=sum[rt<<1|1])
40         ret =  Query(len,rson);
41     PushUp(rt);
42     return ret;
43 }
44 int main()
45 {
46     int h,w,n,i;
47     while(scanf("%d%d%d",&h,&w,&n)!=EOF)
48     {
49         if(h>n)
50             h=n;
51         build(1,h,1,w);
52         int x;
53         for(i=0;i<n;i++)
54         {
55             scanf("%d",&x);
56             if(x>sum[1])
57                 printf("-1\n");
58             else
59             {
60                 printf("%d\n",Query(x,1,h,1));
61             }
62         }
63     }
64 }
View Code

 poj2828

 1 #include<stdio.h>
 2 #define lson l,m,rt<<1
 3 #define rson m+1,r,rt<<1|1
 4 #define maxn 200200
 5 int sum[maxn<<2];
 6 struct node
 7 {
 8     int id;
 9     int v;
10 }a[maxn];
11 int place,map[maxn];
12 void PushUp(int rt)
13 {
14     sum[rt]=sum[rt<<1]+sum[rt<<1|1];
15 }
16 void build(int l,int r,int rt)
17 {
18     if(l==r)
19     {
20         sum[rt]=1;
21         return ;
22     }
23     int m=(l+r)/2;
24     build(lson);
25     build(rson);
26     PushUp(rt);
27 }
28 void Updata(int p,int l,int r,int rt)
29 {
30     if(l==r)
31     {
32         place=l;
33         sum[rt]--;
34         return;
35     }
36     int m=(l+r)/2;
37     if(sum[rt<<1]>=p)
38         Updata(p,lson);
39     else 
40     {
41         p=p-sum[rt<<1];
42         Updata(p,rson);
43     }
44     PushUp(rt);
45 }
46 int main()
47 {
48     int i,n;
49     while(scanf("%d",&n)!=EOF)
50     {
51         build(1,n,1);
52         for(i=0;i<n;i++)
53         {
54             scanf("%d%d",&a[i].v,&a[i].id);
55         }
56         for(i=n-1;i>=0;i--)
57         {
58             Updata(a[i].v+1,1,n,1);
59             map[place]=a[i].id;
60         }
61         for(i=1;i<=n;i++)
62         {
63             if(i==1)
64                 printf("%d",map[i]);
65             else printf(" %d",map[i]);
66         }
67         printf("\n");
68     }
69 }
View Code

hdu1698成段更新

 1 #include<stdio.h>
 2 #define lson l,m,rt<<1
 3 #define rson m+1,r,rt<<1|1
 4 #define maxn 101000
 5 int sum[maxn<<2],mark[maxn<<2];
 6 void pushup(int rt)
 7 {
 8     sum[rt]=sum[rt<<1]+sum[rt<<1|1];
 9 }
10 void build(int l,int r,int rt)
11 {
12     mark[rt]=0;
13     if(l==r)
14     {
15         sum[rt]=1;
16         return;
17     }
18     int m=(l+r)/2;
19     build(lson);
20     build(rson);
21     pushup(rt);
22 }
23 void pushdown(int rt,int len)
24 {
25     if(mark[rt])
26     {
27         mark[rt<<1|1]=mark[rt<<1]=mark[rt];
28         sum[rt<<1]=mark[rt]*(len-len/2);
29         sum[rt<<1|1]=mark[rt]*(len/2);
30         mark[rt]=0;
31     }
32 }
33 void updata(int L,int R,int c,int l,int r,int rt)
34 {
35     if(l>=L&&R>=r)
36     {
37         mark[rt]=c;
38         sum[rt]=c*(r-l+1);
39         return;
40     }
41     pushdown(rt,r-l+1);
42     int m=(l+r)/2;
43     if(m>=L)
44         updata(L,R,c,lson);
45     if(R>m)
46         updata(L,R,c,rson);
47     pushup(rt);
48 }
49 int main()
50 {
51     int n,m,t,ff=0;
52     scanf("%d",&t);
53     while(t--)
54     {
55         scanf("%d",&n);
56         build(1,n,1);
57         scanf("%d",&m);
58         while(m--)
59         {
60             int x,y,z;
61             scanf("%d%d%d",&x,&y,&z);
62             updata(x,y,z,1,n,1);
63         }
64         printf("Case %d: The total value of the hook is %d.\n",++ff,sum[1]);
65     }
66 }
View Code
posted @ 2015-07-13 13:53  sweat123  阅读(164)  评论(0编辑  收藏  举报