码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 1166 线段树单点更新

时间:2015-02-09 10:43:56      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:

等线段树复习完再做个总结

1
10
1 2 3 4 5 6 7 8 9 10
Query 1 3
Add 3 6
Query 2 7
Sub 10 2
Add 6 3
Query 3 10
End

Case 1:
6
33
59

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<queue>
 7 using namespace std;
 8 int n,m,t;
 9 #define lson l,m,rt<<1
10 #define rson m+1,r,rt<<1|1
11 const int maxn=55555;
12 int sum[maxn<<2];
13 void pushup(int rt){
14     sum[rt]=sum[rt<<1]+sum[rt<<1|1];
15 }
16 void build(int l,int r,int rt){
17     if(l==r){
18         scanf("%d",&sum[rt]);
19         return ;
20     }
21     int m=(l+r)>>1;
22     build(lson);
23     build(rson);
24     pushup(rt);
25 }
26 void update(int p,int add,int l,int r,int rt){
27     if(l==r){
28         sum[rt]+=add;
29         return ;
30     }
31     int m=(l+r)>>1;
32     if (p<=m) update(p,add,lson);
33     else update(p,add,rson);
34     pushup(rt);
35 }
36 int query(int L,int R,int l,int r,int rt) {
37     if (L<=l&&r<=R){
38         return sum[rt];
39     }
40     int m=(l+r)>>1;
41     int ret=0;
42     if(L<=m)   ret+=query(L,R,lson);
43     if(R>m)  ret+=query(L,R ,rson);
44     return ret;
45 }
46 int main()
47 {
48     int i,j,k;
49     //freopen("1.in","r",stdin);
50     scanf("%d",&t);
51     for(i=1;i<=t;i++)
52     {
53         printf("Case %d:\n",i);
54         scanf("%d",&n);
55         build(1,n,1);
56         char s[100];
57         int p,v;
58         while(scanf("%s",s)!=EOF)
59         {
60             if(s[0]==E)    break;
61             scanf("%d%d",&p,&v);
62             if(s[0]==A)   update(p,v,1,n,1);
63             else if(s[0]==S)   update(p,-v,1,n,1);
64             else if(s[0]==Q)  printf("%d\n",query(p,v,1,n,1));
65         }
66     }
67     return 0;
68 }

 

/*
1
10
1 2 3 4 5 6 7 8 9 10
Query 1 3
Add 3 6
Query 2 7
Sub 10 2
Add 6 3
Query 3 10
End

Case 1:
6
33
59
*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
int n,m,t;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int maxn=55555;
int sum[maxn<<2];
void pushup(int rt){
    sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void build(int l,int r,int rt){
    if(l==r){
        scanf("%d",&sum[rt]);
        return ;
    }
    int m=(l+r)>>1;
    build(lson);
    build(rson);
    pushup(rt);
}
void update(int p,int add,int l,int r,int rt){
    if(l==r){
        sum[rt]+=add;
        return ;
    }
    int m=(l+r)>>1;
    if (p<=m) update(p,add,lson);
    else update(p,add,rson);
    pushup(rt);
}
int query(int L,int R,int l,int r,int rt) {
    if (L<=l&&r<=R){
        return sum[rt];
    }
    int m=(l+r)>>1;
    int ret=0;
    if(L<=m)   ret+=query(L,R,lson);
    if(R>m)  ret+=query(L,R ,rson);
    return ret;
}
int main()
{
    int i,j,k;
    freopen("1.in","r",stdin);
    scanf("%d",&t);
    for(i=1;i<=t;i++)
    {
        printf("Case %d:\n",i);
        scanf("%d",&n);
        build(1,n,1);
        char s[100];
        int p,v;
        while(scanf("%s",s)!=EOF)
        {
            if(s[0]==‘E‘)    break;
            scanf("%d%d",&p,&v);
            if(s[0]==‘A‘)   update(p,v,1,n,1);
            else if(s[0]==‘S‘)   update(p,-v,1,n,1);
            else if(s[0]==‘Q‘)  printf("%d\n",query(p,v,1,n,1));
        }
    }
    return 0;
}

hdu 1166 线段树单点更新

标签:

原文地址:http://www.cnblogs.com/cnblogs321114287/p/4280938.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!