Problem Description
1 10 2 1 5 2 5 9 3
Case 1: The total value of the hook is 24.
#include <cstdio>
#include <cstring>
#include <algorithm>
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
int const MAX = 100005;
int sum[4 * MAX], lazy[4 * MAX];
int n;
void PushUp(int rt)
{
sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
}
void PushDown(int l, int r, int rt)
{
if(lazy[rt])
{
int mid = (l + r) >> 1;
lazy[rt << 1] = lazy[rt];
lazy[rt << 1 | 1] = lazy[rt];
sum[rt << 1] = lazy[rt] * (mid - l + 1);
sum[rt << 1 | 1] = lazy[rt] * (r - mid);
lazy[rt] = 0;
}
}
void Build(int l, int r, int rt)
{
lazy[rt] = 0;
if(l == r)
{
sum[rt] = 1;
return;
}
int mid = (l + r) >> 1;
Build(lson);
Build(rson);
PushUp(rt);
}
void Update(int L, int R, int c, int l, int r, int rt)
{
if(r < L || l > R)
return;
if(L <= l && r <= R)
{
lazy[rt] = c;
sum[rt] = c * (r - l + 1);
return;
}
PushDown(l, r, rt);
int mid = (l + r) >> 1;
if(L <= mid)
Update(L, R, c, lson);
if(R > mid)
Update(L, R, c, rson);
PushUp(rt);
}
int main()
{
int T;
scanf("%d", &T);
for(int ca = 1; ca <= T; ca++)
{
scanf("%d", &n);
Build(1, n, 1);
int q;
scanf("%d", &q);
while(q--)
{
int l, r, c;
scanf("%d %d %d", &l, &r, &c);
Update(l, r, c, 1, n, 1);
}
printf("Case %d: The total value of the hook is %d.\n", ca, sum[1]);
}
}版权声明:本文为博主原创文章,未经博主允许不得转载。
HDU 1698 Just a Hook (线段树 区间更新基础)
原文地址:http://blog.csdn.net/tc_to_top/article/details/47158743