POJ-3468(线段树区间更新区间查询)
来源:互联网 发布:西科软件招聘 编辑:程序博客网 时间:2024/03/29 15:49
题目:http://poj.org/problem?id=3468
终于将线段(满二叉)树的令一种应用搞懂了,本题需要注意的是中间pushDown的过程中,对delta和len * delta的临时存储要用64bit整数(WA了2次才找到):
#include <cstdio>typedef __int64 LL;const int LEAVES = 128 * 1024;struct Segment{ int left, right; LL sum, delta;};Segment node[LEAVES * 2];void build(int l, int r, int i){ node[i].left = l; node[i].right = r; node[i].sum = 0; node[i].delta = 0; if(l == r) return; int m = (l + r) >> 1; build(l, m, i << 1); build(m + 1, r, i << 1 | 1);}inline void pushUp(int i){ node[i].sum = node[i << 1].sum + node[i << 1 | 1].sum;}inline void pushDown(int i){ int l = i << 1, r = i << 1 | 1; LL d = node[i].delta, lend = (node[l].right - node[l].left + 1) * d; node[l].delta += d; node[l].sum += lend; node[r].delta += d; node[r].sum += lend; node[i].delta = 0;}void update(int p, int i, int d){ if(node[i].left == node[i].right){ node[i].sum += d; return; } int m = (node[i].left + node[i].right) >> 1; if(m >= p) update(p, i << 1, d); else update(p, i << 1 | 1, d); pushUp(i);}void update(int l, int r, int i, int d){ if(l <= node[i].left && r >= node[i].right){ node[i].sum += d * (node[i].right - node[i].left + 1); node[i].delta += d; return; } if(node[i].delta) pushDown(i); int m = (node[i].left + node[i].right) >> 1; if(m >= r) update(l, r, i << 1, d); else if(m < l) update(l, r, i << 1 | 1, d); else{ update(l, m, i << 1, d); update(m + 1, r, i << 1 | 1, d); } pushUp(i);}LL query(int l, int r, int i){ if(l <= node[i].left && r >= node[i].right) return node[i].sum; if(node[i].delta) pushDown(i); int m = (node[i].left + node[i].right) >> 1; if(m >= r) return query(l, r, i << 1); else if(m < l) return query(l, r, i << 1 | 1); else return query(l, m, i << 1) + query(m + 1, r, i << 1 | 1);}int ceilingPower2(int n){ int m = 1; for(; m < n; m <<= 1) ; return m;}int main(){ char o; int N, Q, i, d, l, r; while(scanf("%d%d", &N, &Q) == 2){ build(1, ceilingPower2(N), 1); for(i = 1; i <= N; ++i){ scanf("%d", &d); update(i, 1, d); } while(Q--){ scanf(" %c %d %d", &o, &l, &r); if(o == 'Q') printf("%I64d\n", query(l, r, 1)); else{ scanf("%d", &d); update(l, r, 1, d); } } } return 0;}
0 0
- POJ-3468(线段树区间更新区间查询)
- POJ 3468 线段树 区间更新区间查询
- POJ 3468 (线段树,区间更新,查询区间)
- POJ 3468 A Simple Problem with Integers(线段树区间更新区间查询)
- POJ.3468 A Simple Problem with Integers(线段树 区间更新 区间查询)
- 线段树 (更新区间查询区间)poj 3468 A Simple Problem with Integers
- POJ 3468 线段树(区间更新)
- POJ 2777 线段树区间查询区间更新
- POJ 2777 Count Color(线段树,区间更新,查询)
- 线段树--区间更新区间查询--hdu4027
- 线段树区间查询区间更新
- poj 3468 A Simple Problem with Integers(线段树+树状数组区间更新区间查询)
- POJ 题目3667 Hotel(线段树,区间更新查询,求连续区间)
- POJ A Simple Problem with Integers (线段树区间更新区间查询模板)
- hdu 5023(线段树区间更新+区间查询)
- codevs 4919 线段树:区间更新,区间查询(余数)
- POJ 3468 线段树 区间更新+区间求和
- POJ 3468 线段树 区间更新
- ADO.NET 增删改查
- 为什么ACM美国不如中国
- hdu 4300 Clairewd’s message (KMP)
- 概要设计说明书结构示例
- new String() 和直接赋值的注意事项
- POJ-3468(线段树区间更新区间查询)
- 进程、线程间通信的方式
- 《平凡的世界》读后感
- java WEB 集成Spring之插入通知
- HDU1242-Rescue
- spoj 375 Query on a tree(树链剖分模版)
- 设计模式の面向对象
- JSP 页面实现文件上传
- 杨昌英诉张世雄子女抚养及财产分割纠纷案