kuangbin专题七、线段树

题意:线段树,单点更新,区间查询

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cmath>
 5 using namespace std;
 6
 7 const int maxn=5e4+5;
 8 int sum[maxn*4];  //sum求和,开四倍空间
 9 int num[maxn];  //存原数组下标[1,n]
10
11 //up更新节点信息,这里是求和
12 void up(int rt)
13 {
14     sum[rt]=sum[rt<<1]+sum[rt<<1|1];
15 }
16 //build建立线段树
17 void build(int rt,int l,int r)
18 {
19     if(l==r)//若到达叶节点
20     {
21         sum[rt]=num[l]; //存储A数组的值
22         return;
23     }
24     int m=(l+r)>>1;
25     build(rt<<1,l,m);//左右递归
26     build(rt<<1|1,m+1,r);
27     up(rt);  //更新信息
28 }
29 void update(int p,int add,int rt,int l,int r)
30 {
31     if(l==r)//到达叶节点,修改叶节点的值
32     {
33         sum[rt]+=add;
34         return;
35     }
36     int m=(l+r)>>1;
37     //根据条件判断往左子树调用,还是往右
38     if(p>m) update(p,add,rt<<1|1,m+1,r);
39     else update(p,add,rt<<1,l,m);
40     up(rt); //子节点更新了,本节点也要更新
41 }
42 int query(int L,int R,int rt,int l,int r)
43 {
44     if(L<=l && r<=R) return sum[rt];//区间内直接返回
45     int m=(l+r)>>1;
46     //累加答案
47     int ret=0;
48     if(L<=m) ret+=query(L,R,rt<<1,l,m);//左子区间有重叠,递归
49     if(R>m)ret+=query(L,R,rt<<1|1,m+1,r);//右子区间有重叠,递归
50     return ret;
51 }
52 int main()
53 {
54     int t;
55     scanf("%d",&t);
56     for(int kase=1;kase<=t;kase++)
57     {
58         int n;
59         memset(sum,0,sizeof(sum));
60         scanf("%d",&n);
61         for(int i=1;i<=n;i++)
62             scanf("%d",&num[i]);
63         build(1,1,n);
64         printf("Case %d:\n",kase);
65         char s[10];
66         while(scanf("%s",&s)!=EOF && strcmp(s,"End"))
67         {
68             int x,y;
69             scanf("%d%d",&x,&y);
70             if(s[0]==‘Q‘)printf("%d\n",query(x,y,1,1,n));
71             else if(s[0]==‘A‘)update(x,y,1,1,n);
72             else if(s[0]==‘S‘)update(x,-y,1,1,n);
73         }
74     }
75     return 0;
76 }
时间: 2024-08-09 04:26:53

kuangbin专题七、线段树的相关文章

【算法系列学习】线段树vs树状数组 单点修改,区间查询 [kuangbin带你飞]专题七 线段树 A - 敌兵布阵

https://vjudge.net/contest/66989#problem/A 单点修改,区间查询 方法一:线段树 http://www.cnblogs.com/kuangbin/archive/2011/08/15/2139834.html 1 #include<iostream> 2 #include<cstdio> 3 #include<string> 4 #include<cstring> 5 #include<cmath> 6 #

[kuangbin带你飞]专题七 线段树

A - 敌兵布阵 HDU - 1166 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况.由于采取了某种先进的监测手段,所以每个工兵营地的人数C国都掌握的一清二楚,每个工兵营地的人数都有可能发生变动,可能增加或减少若干人手,但这些都逃不过C国的监视. 中央情报局要研究敌人究竟演习什么战术,所以Tidy要随时向Derek汇报某一段连续的工兵营地一共有多少

&#183;专题」 线段树

PKU暑期培训第一天,这次培训人很多,但是感觉打酱油的也不少,不知道大牛有多少. 第一天都是讲线段树的,课件的话和往常一样,没什么变化. 具体的话,讲了线段树和树状数组.线段树的话讲了单点更新,成段更新,扫描线已经离散化. 然后随便提了提树状数组.估计明天再讲一点点,然后接着是讲并查集,多串匹配什么的. 线段树的题目我做得很少,以前看过HH大神的模板,想模仿来着,其实也没什么理解. 重新理解一下线段树吧. 线段树的用途,主要是维护区间问题,比如区间的单点更新操作,成段更新,扫描线等等.当然还有一

·专题」 线段树

初学线段树(SegmentTree) 从HH大神那你学来的模板风格. 感觉确实相当飘逸. 现在做了4题..单点更新的, 想放上来,,以后慢慢整理!! ·单点更新」 ·刷题参考」 hdu1166 敌兵布阵 线段树第一题,单点更新第一题,可以作为线段树的模板, 思路:兵工厂作为数量n映射作为线段总长,更具输入进行单点的更新与查询,sub操作可以理解为add一个负数 Query操作:区间求和 update操作:单点的增减 1 #include<cstdio> 2 3 #define lson l,

kuangbin专题七 HDU1540 Tunnel Warfare (前缀后缀线段树)

During the War of Resistance Against Japan, tunnel warfare was carried out extensively in the vast areas of north China Plain. Generally speaking, villages connected by tunnels lay in a line. Except the two at the ends, every village was directly con

kuangbin专题七 HDU1698 Just a Hook (set线段树)

In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of the heroes. The hook is made up of several consecutive metallic sticks which are of the same length. Now Pudge wants to do some operations on the hook. Let us numb

kuangbin带我飞QAQ 线段树

1. HDU1166 裸线段树点修改 1 #include <iostream> 2 #include <string.h> 3 #include <cstdio> 4 #include <queue> 5 #include <map> 6 #include <vector> 7 #include <string> 8 #include <cstring> 9 #include <algorithm>

kuangbin专题七 HDU1754 I Hate It (单点修改维护最大值)

很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老师有时候需要更新某位同学的成绩. Input本题目包含多组测试,请处理到文件结束. 在每个测试的第一行,有两个正整数 N 和 M ( 0<N<=200000,0<M<5000 ),分别代表学生的数目和操作的数目. 学生ID编号分别从1编到N. 第二行包含N个整数,代表这N个学生的初始成绩,

[kuangbin]带你飞之&#39;线段树&#39;专题(未完成)

// 带飞网址 https://vjudge.net/article/187 专题七 线段树 HDU 1166 敌兵布阵HDU 1754 I Hate It√ POJ 3468 A Simple Problem with IntegersPOJ 2528 Mayor's postersHDU 1698 Just a HookZOJ 1610 Count the ColorsPOJ 3264 Balanced LineupHDU 4027 Can you answer these queries?