【阿柟的复习计划】线段树-基础刷题(回炉重造)
来源:互联网 发布:淘宝给老客户发优惠券 编辑:程序博客网 时间:2024/06/15 13:49
好吧这是寒假时候的事了。然而三个数据结构(线段树、树状数组、st表)里面我就听懂了线段树。真是太惨了。而我之前也没有把线段树的操作搞清楚。真是惨死了。
好吧,根据网上各位大佬的题目汇总里面最基础的几道题刷过以后有几个感想。线段树果然还是又臭又长啊。容易编错。
hudu1166 敌兵布阵
#include<cstdio> #include<cstring>#define N 100010using namespace std;int T, n, t, a[N];struct Node { int sum, flag; Node *ls, *rs; void pushdown(int l, int r) { if(flag) { int mid = (l + r) >> 1; ls->flag += flag; ls->sum += (mid - l + 1) * flag; rs->flag += flag; rs->sum += (r - mid) * flag; flag = 0; } } void update() { sum = ls->sum + rs->sum; }}pool[N * 10], *tail = pool, *root;Node *build(int l, int r) { Node *bt = ++tail; if(l == r) { bt->sum = a[l]; bt->flag = 0; } else { int mid = (l + r) >> 1; bt->ls = build(l, mid); bt->rs = build(mid + 1, r); bt->sum = bt->ls->sum + bt->rs->sum; bt->flag = 0; } return bt;}void modify(int pos, int delta, int l, int r, Node *bt) { if(l == pos && r == pos) { bt->sum += delta; bt->flag += delta; return ; } int mid = (l + r) >> 1; bt->pushdown(l, r); if(pos <= mid) modify(pos, delta, l, mid, bt->ls); if(pos > mid) modify(pos, delta, mid + 1, r, bt->rs); bt->update();}int query(int L, int R, int l, int r, Node *bt) { if(l >= L && r <= R) { return bt->sum; } int mid = (l + r) >> 1; int rt = 0; bt->pushdown(l, r); if(L <= mid) rt += query(L, R, l, mid, bt->ls); if(R > mid) rt += query(L, R, mid + 1, r, bt->rs); return rt;}int main() { scanf("%d", &T); for(int i = 1; i <= T; i++) { printf("Case %d:\n", i); scanf("%d", &n); for(int i = 1; i <= n; i++) scanf("%d", &a[i]); root = build(1, n); char s[10]; scanf("%s", s); while(s[0] != 'E') { if(s[0] == 'A') { int pos, delta; scanf("%d%d", &pos, &delta); modify(pos, delta, 1, n, root); } if(s[0] == 'S') { int pos, delta; scanf("%d%d", &pos, &delta); modify(pos, -delta, 1, n, root); } if(s[0] == 'Q') { int L, R; scanf("%d%d", &L, &R); printf("%d\n", query(L, R, 1, n, root)); } scanf("%s", s); } } return 0;}
其实没刷几道题,主要还是为了练下手,毕竟这个线段树很有名堂,很多东西都可以套。数据结构别的可以放放,这个必须要掌握啊!
阅读全文
0 0
- 【阿柟的复习计划】线段树-基础刷题(回炉重造)
- 回炉重造的BaseAdapter3.0
- 回炉重造
- java回炉重造(一)
- 蒟蒻的回炉重造划水记录
- Java回炉重造(四)IterableMap:易于遍历的Map
- 裸辞之回炉重造(牛客网刷题总结)
- 【阿柟的复习计划】暑假要做些什么?
- 【阿柟的复习计划】暑假要做些什么?
- Java回炉重造(二)静态代理
- Java回炉重造(一)Socket的客户端和服务端通信
- 回炉重造之设计模式——单例模式(Java)
- 回炉重造,第一话:PHP语法与数据类型
- 回炉重造,第二话:PHP算数运算符
- 回炉重造,第三话:PHP顺序控制
- 回炉重造,第四话:PHP循环控制
- 回炉重造,第五话:PHP回顾与练习
- 回炉重造,第六话:php部分语句
- JSON总结(1)
- 作业,进程组,终端
- Ubuntu下安裝NDK工具,编译JNI文件
- zoj3593 扩展欧几里德
- 使用OkHttp上传图片
- 【阿柟的复习计划】线段树-基础刷题(回炉重造)
- 补间动画
- 关于使用Git的时候出现"HTTP 413 curl 22 The requested URL returned error: 413 Request Entity Too Large"的解决方法
- oracle位与或等比特运算
- 个人模板 Kruskal 最小生成树
- CSDN物联网学习2 IoT应用开发平台巡礼
- 显示器 设置选项 解析
- Homework_3
- TypeScript Cannot find name 'Symbol'