线段树 成段更新 hdu1698
2011-12-18 22:00
357 查看
题意:该表屠夫某一段钩子的价值,n次改变,最后输出总价值。
#include <iostream> #include <cstdio> using namespace std; #define N 100005 int sum[N << 2], col[N << 2]; inline void pushUp(int rt) { sum[rt] = sum[rt << 1] + sum[rt << 1 | 1]; } void pushDown(int rt, int len) { col[rt << 1] = col[rt << 1 | 1] = col[rt]; sum[rt << 1] = col[rt] * (len - (len >> 1)); sum[rt << 1 | 1] = col[rt] * (len >> 1); col[rt] = 0; } void build(int l, int r, int rt) { col[rt] = 0; if (l == r) { sum[rt] = 1; return; } int m = (l + r) >> 1; build (l, m, rt << 1); build (m + 1, r, rt << 1 | 1); pushUp(rt); } void update(int L, int R, int c, int l, int r, int rt) { if (l >= L && r <= R) { col[rt] = c; sum[rt] = c * (r - l + 1); return; } if (col[rt]) pushDown (rt, r - l + 1); int m = (l + r) >> 1; if (m >= L) update (L, R, c, l, m, rt << 1); if (m < R) update (L, R, c, m + 1, r, rt << 1 | 1); pushUp (rt); } int main() { int T, n, q; scanf ("%d", &T); for (int t = 1; t <= T; t++) { scanf ("%d\n%d", &n, &q); build (1, n, 1); while (q--) { int a, b, c; scanf ("%d %d %d", &a, &b, &c); update (a, b, c, 1, n, 1); } printf ("Case %d: The total value of the hook is %d.\n", t, sum[1]); } return 0; }
相关文章推荐
- HDU1698 Just a Hook 【线段树】+【成段更新】+【lazy标记】
- hdu1698 线段树成段更新
- hdu1698 Just a Hook(线段树成段更新lazy)
- 【线段树成段更新-模板】【HDU1698】Just a Hook
- 【HDU1698】【线段树成段更新】
- 【线段树成段更新-模板】【HDU1698】Just a Hook
- hdu1698(线段树成段更新+lazy标记)
- HDU1698 Just a Hook 【线段树】+【成段更新】+【lazy标记】
- Hdu1698 Just a Hook(线段树成段更新)
- 线段树---成段更新hdu1698 Just a Hook
- 线段树---成段更新hdu1698 Just a Hook
- HDU1698_Just a Hook(线段树/成段更新)
- 【hdu1698-Just aHook】(线段树成段更新)
- HDU1698_Just a Hook(线段树/成段更新)
- 线段树 区间更新(成段更新) HDU1698
- HDU1698 Just a Hook(线段树+成段更新+lazy标记)
- hdu1698(线段树,简单的成段更新)
- hdu1698-Just a Hook (线段树区间更新)(延迟标记)
- POJ3468 A Simple Problem with Integers 线段树 区间成段更新+区间求和
- hdu 1698 Just a Hook(线段树 成段更新+总区间求和)