博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 1116 敌兵布阵 线段树 区间求和 单点更新
阅读量:6692 次
发布时间:2019-06-25

本文共 1445 字,大约阅读时间需要 4 分钟。

线段树的基本知识可以先google一下,不是很难理解

线段树功能:update:单点增减 query:区间求和

#include 
#define lson l, m, rt<<1#define rson m+1, r, rt<<1|1using namespace std;const int MAXN = 50008;int sum[MAXN<<2];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); sum[rt] = sum[rt<<1] + sum[rt<<1|1];}int query(int L, int R, int l, int r, int rt){ if(L <= l && r <= R) return sum[rt]; int ret = 0; int m = (l + r) >> 1; if(L <= m) ret += query(L, R, lson); if(R > m) ret += query(L, R, rson); return ret;}void updata(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) updata(p, add, lson); else updata(p, add, rson); sum[rt] = sum[rt<<1] + sum[rt<<1|1];}int main(){// freopen("in.txt", "r", stdin); int T, Case = 0; scanf("%d", &T); while(T--) { int n; scanf("%d", &n); build(1, n, 1); printf("Case %d:\n", ++Case); char s[10]; while(~scanf("%s", s)) { if(s[0] == 'E') break; int a,b; scanf("%d%d", &a, &b); if(s[0] == 'Q') printf("%d\n", query(a, b, 1, n, 1)); else if(s[0] == 'A') updata(a, b, 1, n, 1); else updata(a, -b, 1, n, 1); } } return 0;}

 

转载于:https://www.cnblogs.com/pach/p/7346529.html

你可能感兴趣的文章
Nodejs 连接各种数据库集合例子
查看>>
easyui的datagrid用js插入数据等编辑功能的实现
查看>>
Windows App开发之集合控件与数据绑定
查看>>
AMD、CMD/AMD与CMD的区别
查看>>
Python~第一天
查看>>
Linux管理用户账号
查看>>
redis中使用lua脚本
查看>>
颜色数组
查看>>
ELASTICSEARCH清理过期数据
查看>>
oo第三次博客作业
查看>>
《结对-结对编项目作业名称-需求分析》
查看>>
iView3.x Anchor(锚点)组件 导航锚点
查看>>
Network --- Tcp Protocol
查看>>
sqlite效率探测
查看>>
React生命周期
查看>>
数据库 -- mysql表操作
查看>>
shutil 高级文件操作
查看>>
Itellij Idea全局搜索
查看>>
Android系统简介
查看>>
配置证书
查看>>