hdu 1166 线段树单点更新

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

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;
}

时间: 2025-01-16 06:46:05

hdu 1166 线段树单点更新的相关文章

HDU 4302 线段树单点更新,维护区间最大最小值

http://acm.hdu.edu.cn/showproblem.php?pid=4302 Problem Description Holedox is a small animal which can be considered as one point. It lives in a straight pipe whose length is L. Holedox can only move along the pipe. Cakes may appear anywhere in the p

HDU 1394(线段树单点更新)

题意:就是给出一串数,当依次在将第一个数变为最后一个数的过程中,要你求它的最小逆序数. 思路:可以用树状数组和线段数做.这里我是用线段树做的.建的是一棵空树,然后每插入一个点之前,统计大于这个数的有多少个,直到所有的数都插入完成,就结果了逆序树的统计. 要得出答案主要是利用了一个结论,如果是0到n的排列,那么如果把第一个数放到最后,对于这个数列,逆序数是减少a[i],而增加n-1-a[i]的. #include<iostream> #include<cstring> #includ

hdu 3308 线段树单点更新 区间合并

http://acm.hdu.edu.cn/showproblem.php?pid=3308 学到两点: 1.以区间端点为开始/结束的最长......似乎在Dp也常用这种思想 2.分类的时候,明确标准逐层分类,思维格式: 条件一成立: { 条件二成立: { } else { } } else { 条件二成立: { } else { } } 上面的这种方式很清晰,如果直接想到那种情况iif(条件一 &条件二)就写,很容易出错而且把自己搞乱,或者情况不全,,,我就因为这WA了几次 3.WA了之后 ,

HDU 2795 线段树单点更新

Billboard Time Limit: 20000/8000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 23498    Accepted Submission(s): 9687 Problem Description At the entrance to the university, there is a huge rectangular billboard of s

HDU 3308 线段树单点更新+区间查找最长连续子序列

LCIS                                                              Time Limit: 6000/2000 MS (Java/Others)                                                                 Memory Limit: 65536/32768 K (Java/Others)                                       

hdu 1754 线段树 单点更新 动态区间最大值

I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 52417    Accepted Submission(s): 20598 Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感.不管你喜不喜欢,现在需要你做的是,就是按照老师的

HDU 2795 (线段树 单点更新) Billboard

h*w的木板,放进一些1*L的物品,求每次放空间能容纳且最上边的位子. 每次找能放纸条而且是最上面的位置,询问完以后可以同时更新,所以可以把update和query写在同一个函数里. 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 6 const int maxn = 200000 + 10; 7 8 int _max[maxn <&l

HDU 1166 敌兵布阵(线段树单点更新,板子题)

敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 87684    Accepted Submission(s): 36912 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务

HDU 1166 敌兵布阵 (线段树 单点更新)

题目链接 线段树掌握的很差,打算从头从最简单的开始刷一波, 嗯..就从这个题开始吧! 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 #include <cstdlib> 6 #include <algorithm> 7 const int maxn = 50000+10; 8 using namespace std