您的位置:首页 > 其它

HDU - 1698 Just a Hook(线段树)

2015-10-20 23:13 316 查看
题目大意:给你一个区间,N个操作,操作如下:

l r c,将区间[l,r]的所有数变成c,问最后区间的和

解题思路:线段树的区间修改,维护和

#include <cstdio>
#include <cstring>
const int N = 100010 << 2;

int val
, sum
, setv
;
int n;

void build(int u, int l, int r) {
setv[u] = -1;
if (l == r) {
setv[u] = -1;
return ;
}
int mid = (l + r) >> 1;
build(u << 1, l, mid);
build((u << 1) + 1, mid + 1, r);
}

void PushDown(int u) {
if (setv[u] == -1) return ;
setv[u << 1] = setv[(u << 1) + 1] = setv[u];
setv[u] = -1;
}

void modify(int u, int l, int r, int L, int R, int c) {
if (L <= l && r <= R) {
setv[u] = c;
return ;
}
PushDown(u);
int mid = (l + r) >> 1;
if (L <= mid) modify(u << 1, l, mid, L, R, c);
if (R > mid) modify((u << 1) + 1, mid + 1, r, L, R, c);
}

void PushUp(int u, int l, int r) {
if (setv[u] != -1) {
sum[u] = (r - l + 1) * setv[u];
return ;
}

if (l == r) {
sum[u] = 1;
return ;
}

int mid = (l + r) >> 1;
PushUp(u << 1, l, mid);
PushUp((u << 1) + 1, mid + 1, r);
sum[u] = sum[u << 1] + sum[(u << 1) + 1];
}

int cas = 1;
void solve() {
int p;
scanf("%d", &p);
while (p--) {
int x, y, z;
scanf("%d%d%d", &x, &y, &z);
modify(1, 1, n, x, y, z);
}
PushUp(1, 1, n);
printf("Case %d: The total value of the hook is %d.\n", cas++, sum[1]);
}

int main() {
int test;
scanf("%d", &test);
while (test--) {
scanf("%d", &n);
build(1, 1, n);
solve();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: