线段树练习五
来源:互联网 发布:interbase数据库启动 编辑:程序博客网 时间:2024/05/22 02:06
Description
一行N个方格,开始每个格子里的数都是0。现在动态地提出一些问题和修改:提问的形式是求某一个特定的子区间[a,b]中所有元素的和;修改的规则是指定某一个格子x,加上或者减去一个特定的值A。现在要求你能对每个提问作出正确的回答。1≤N≤100000,提问和修改的总数可能达到100000条。
Input
20 //方格个数
6 //有几组操作
M 1 1 //表示修改,第一个表示格子位置,第二个数表示在原来的基础上加上的数,
M 2 2
M 3 4
M 3 -5
M 6 7
C 2 6 //表示统计 ,第一个数表示起始位置,第二个数表示结束位置
Output
8
做法:维护一个区间sum。。其实也是模板题
代码如下:
#include <cstdio>#include <iostream>#include <cstring>using namespace std;int c[1000000],n,m;char s;void update(int p,int l,int r,int x,int add){ int m=(l+r) / 2; if (l==r) { c[p]+=add; return; } if (x<=m) update(p*2,l,m,x,add); if (x>m) update(p*2+1,m+1,r,x,add); c[p]=c[p<<1]+c[p<<1|1];}int find(int p,int l,int r,int a,int b){ if (l==a && r==b) return c[p]; else { int m=(l+r) / 2; if (b<=m) return find(p*2,l,m,a,b); else if (a>m) return find(p*2+1,m+1,r,a,b); else return find(p*2,l,m,a,m)+find(p*2+1,m+1,r,m+1,b); }}int main(){ scanf("%d",&n); scanf("%d",&m); for (int i=1;i<=m;i++) { cin>>s; if (s=='M') { int x,y; scanf("%d%d",&x,&y); update(1,1,n,x,y); } if (s=='C') { int x,y; scanf("%d%d",&x,&y); printf("%d\n",find(1,1,n,x,y)); } }}
阅读全文
0 0
- 线段树练习五
- 线段树练习五(+树状数组)
- 【SSLGZ 2648】线段树练习五
- SSL P2648 线段树练习五
- 线段树练习
- Wikioi1080线段树练习
- 线段树练习
- 【wikioi1080】 线段树练习
- 线段树练习
- 线段树练习
- 线段树练习 2
- 线段树1练习
- 线段树2练习
- 线段树练习3
- Codevs1080 线段树练习
- 线段树练习4
- 1080 线段树练习
- 线段树练习
- 使用Postman Interceptor插件解决REST客户端的post请求的CSRF
- 诸多杂项
- IDEA使用JUnit测试插件
- SQL TOP & LIKE
- 深度学习——VGG网络
- 线段树练习五
- FTPClient的使用(二) ftp(文件夹和文件)下载,上传,复制备份
- Java中的内存泄漏
- 【学习笔记】C++primer plus 13.继承
- C语言枚举类型
- Java构造器
- caffe层解读系列——slice和concat实现MultiTask
- 数据结构与算法----顺序查找法
- Linux vim 四种模式切换