标签:des style http os io for ar div
Description
Input
Output
Sample Input
1 10 2 1 5 2 5 9 3
Sample Output
Case 1: The total value of the hook is 24.
题意:让你修改[l, r]的类型为v, v的种类不同,分数不同,求所有操作后的总和,默认值是1
思路:线段树的区间修改,不算太难
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #define lson(x) ((x) << 1) #define rson(x) ((x) << 1 | 1) using namespace std; const int maxn = 100005; struct seg { int w; int v; }; struct segment_tree { seg node[maxn<<2]; void update(int pos) { node[pos].w = node[lson(pos)].w + node[rson(pos)].w; } void push(int pos, int len) { if (node[pos].v > 0) { node[lson(pos)].v = node[rson(pos)].v = node[pos].v; node[lson(pos)].w = node[pos].v * (len - (len >> 1)); node[rson(pos)].w = node[pos].v * (len >> 1); node[pos].v = 0; } } void build(int l, int r, int pos) { node[pos].v = 0; if (l == r) { node[pos].w = 1; return; } int m = l + r >> 1; build(l, m, lson(pos)); build(m+1, r, rson(pos)); update(pos); } void modify(int l, int r, int pos, int x, int y, int z) { if (x <= l && y >= r) { node[pos].w = (r-l+1) * z; node[pos].v = z; return; } push(pos, r-l+1); int m = l + r >> 1; if (x <= m) modify(l, m, lson(pos), x, y, z); if (y > m) modify(m+1, r, rson(pos), x, y, z); update(pos); } int query(int l, int r, int pos, int x, int y) { if (x <= l && y >= r) return node[pos].w; push(pos, r-l+1); int m = l + r >> 1; if (x <= m) query(l, m, lson(pos), x, y); if (y > m) query(m+1, r, rson(pos), x, y); } } tree; int main() { int n, q, cas = 1; int t; scanf("%d", &t); while (t--) { scanf("%d", &n); tree.build(1, n, 1); scanf("%d", &q); int x, y, z; for (int i = 0; i < q; i++) { scanf("%d%d%d", &x, &y, &z); tree.modify(1, n, 1, x, y, z); } printf("Case %d: The total value of the hook is %d.\n", cas++, tree.node[1].w); } return 0; }
HDU - 1698 Just a Hook (线段树区间修改),布布扣,bubuko.com
HDU - 1698 Just a Hook (线段树区间修改)
标签:des style http os io for ar div
原文地址:http://blog.csdn.net/u011345136/article/details/38355655