线段树 成段更新
2013-11-23 10:47
155 查看
关键在于延迟标记
hdu 1698
给定区间了l, r,将区间内的每一个数都设置为v;
poj 3468
给定区间l, r, 将区间内的每一个数加上v;
hdu 1698
给定区间了l, r,将区间内的每一个数都设置为v;
// 1698 #include <cstdio> const int maxn = 100005; int node[maxn<<2], col[maxn<<2]; int t,n, q, ca = 1; int ql, qr, v; void construct(int o, int l, int r) { col[o] = 0; if(l == r) { node[o] = 1; return; } int m = (l+r) >> 1; construct(2*o, l, m); construct(2*o+1, m+1, r); node[o] = node[2*o] + node[2*o+1]; } void pushdown(int o, int l, int r) { if(col[o]) { col[2*o] = col[2*o+1] = col[o]; int m = (l+r) >> 1; node[2*o] = col[o] * (m-l+1); node[2*o+1] = col[o] * (r-m); col[o] = 0; } } void update(int o, int l, int r) { if(ql<=l && qr>=r) { col[o] = v; node[o] = (r-l+1) * v; return; } pushdown(o, l, r); int m = (l+r) >> 1; if(ql <= m) update(2*o, l, m); if(qr > m) update(2*o+1, m+1, r); node[o] = node[2*o] + node[2*o+1]; } int main() { scanf("%d", &t); while(t--) { scanf("%d", &n); construct(1, 1, n); scanf("%d", &q); while(q--) { scanf("%d %d %d", &ql, &qr, &v); update(1, 1, n); } printf("Case %d: The total value of the hook is %d.\n", ca++, node[1]); } return 0; }
poj 3468
给定区间l, r, 将区间内的每一个数加上v;
// 1698 #include <cstdio> const int maxn = 100005; int node[maxn<<2], col[maxn<<2]; int t,n, q, ca = 1; int ql, qr, v; void construct(int o, int l, int r) { col[o] = 0; if(l == r) { node[o] = 1; return; } int m = (l+r) >> 1; construct(2*o, l, m); construct(2*o+1, m+1, r); node[o] = node[2*o] + node[2*o+1]; } void pushdown(int o, int l, int r) { if(col[o]) { col[2*o] = col[2*o+1] = col[o]; int m = (l+r) >> 1; node[2*o] = col[o] * (m-l+1); node[2*o+1] = col[o] * (r-m); col[o] = 0; } } void update(int o, int l, int r) { if(ql<=l && qr>=r) { col[o] = v; node[o] = (r-l+1) * v; return; } pushdown(o, l, r); int m = (l+r) >> 1; if(ql <= m) update(2*o, l, m); if(qr > m) update(2*o+1, m+1, r); node[o] = node[2*o] + node[2*o+1]; } int main() { scanf("%d", &t); while(t--) { scanf("%d", &n); construct(1, 1, n); scanf("%d", &q); while(q--) { scanf("%d %d %d", &ql, &qr, &v); update(1, 1, n); } printf("Case %d: The total value of the hook is %d.\n", ca++, node[1]); } return 0; }
相关文章推荐
- hdu1698Just a Hook 线段树 成段更新水题
- CodeForces 356A Knight Tournament(线段树成段更新)
- TOJ 4489 You are a Boss / 线段树成段更新
- hdu 1698 线段树-成段更新
- POJ 3468:A Simple Problem with Integers(线段树[成段更新])
- hdu4267线段树段更新,点查找,55棵线段树.
- HDU-3225 Help with Intervals 线段树成段更新
- poj3468 线段树成段更新水题
- 行电1698 线段树 成段更新
- 九度OJ 题目1496:数列区间 (线段树 区间合并 +成段更新)
- POJ 2155 Matrix(快)(二维线段树段更新求点和)(不保存left,right域)
- 线段树成段更新操作及Lazy思想(POJ3468解题报告)
- POJ3468-A Simple Problem with Integers(线段树 成段更新求和)
- HDU 1698 Just a Hook(线段树,成段更新)
- 线段树成段更新1002 POJ3468
- POJ 3468-A Simple Problem with Integers(线段树:成段更新,区间求和)
- ZOJ 1610 Count the Colors 线段树 成段更新 单点求值
- hdu 2871 线段树 成段更新+STL
- poj 3225 线段树之成段更新集合运算(交、并)
- POJ 3667(线段树,区间合并,成段更新)