题意:

给定n个兵营的士兵初始值, 然后有最多40000个操作;

操作一共有两种, 一个是查询给定[a,b]区间兵营的士兵总和。

另一个是增加/减少指定兵营的士兵数目。

输出每次查询的值。

分析:

线段树单点更新模板

代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn = + ;
struct{
int l, r, sum;
}tree[maxn*];//起码要*4
int a[maxn];
int n;
void build(int index, int l , int r){
tree[index].l = l, tree[index].r = r;
if( l == r){
tree[index].sum = a[l];//递归建树,当l=r就是叶子节点没办法再分,直接赋值
return;
}
int mid = (l+r) / ;
build(index * , l, mid);
build(index * + , mid + , r);
tree[index].sum = tree[index * ].sum + tree[index* + ].sum;//不是叶子节点, 总和等于它儿子的总和
} void update(int index, int a, int val){ //修改总和的
if(tree[index].l == a && tree[index].r == a){
tree[index].sum += val;//找到该点,直接更改
return;
}
int mid = (tree[index].l + tree[index].r) / ; if(a <= mid)
update(index * , a , val);
else
update(index * + , a, val); tree[index].sum += val;//路径上的点都要更改。
} int query(int index , int ql, int qr){ if(tree[index].l == ql && tree[index].r == qr){
return tree[index].sum;
} int mid = (tree[index].l + tree[index].r) / ;
if(qr <= mid) //查询区间只在这个的左子树
return query(index * , ql, qr);
if(ql > mid) //只在右子树
return query(index * + , ql, qr); return query(index * , ql, mid) + query(index * + , mid + , qr);//左右子树都有的话, 拆分查询区间
} int main(){
int T;
scanf("%d", &T);
int kase = ;
while(T--){
printf("Case %d:\n", kase++);
scanf("%d", &n);
for(int i = ; i <= n; i++){
scanf("%d", &a[i]);
}
build(,,n);
char cho[];
while(scanf("%s",cho) && cho[] != 'E'){
int x, y;
scanf("%d %d", &x, &y);
if(cho[] == 'Q'){
printf("%d\n", query(,x,y));
}
else if(cho[] == 'A'){
update(,x,y);
}
else update(,x,-y);
}
}
return ;
}

最新文章

  1. 问题解决——Win7 64 安装 AutoCAD 2010 32位 和 清华天河PC CAD
  2. ACM题目————二叉树最大宽度和高度
  3. PHP 自 5.2 到 5.6 中新增的功能详解
  4. Google代码实验室
  5. CC2530 PWM波形产生。
  6. MVC-Easy-UI-datagrid-分页-查询
  7. bootstrip 折叠菜单
  8. JavaWeb(一)JavaWeb应用的概念
  9. 写在最前面 - 《看懂每一行代码 - kubernetes》
  10. Windows10常用快捷键
  11. postgresql-pg_prewarm数据预加载。
  12. 【noip模拟赛3】确定的位置 (map的遍历 位置原理)
  13. C#简单的通用分页
  14. JavaScript获取事件对象和目标对象
  15. gis 相关资料
  16. ThinkPHP联表查询
  17. c语言基础知识要点
  18. 【329】word 替换文本高级用法
  19. Oracle数据库PLSQL的中文乱码显示全是问号
  20. 【Python】随机漫步

热门文章

  1. websocket来回收发消息
  2. Hdu 2089 不要62 (数位dp入门题目)
  3. 大数模板 (C ++)
  4. ACM_LRU页面置换算法
  5. discuz x2.5用户注册后邮箱认证后无法收到邮件或者直接进垃圾箱
  6. 关于Control.Dispatcher.BeginInvoke卡界面
  7. AJPFX总结java开发常用类(包装,数字处理集合等)(一)
  8. LN : leetcode 486 Predict the Winner
  9. Bean with name &#39;xxxService&#39; has been injected into other beans [xxxServiceA,xxxServiceB] in its raw version as part of a circular reference, but has eventually been wrapped
  10. TabLayout.Tab(自定义)点击事件