标签: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