http://acm.hdu.edu.cn/showproblem.php?pid=1698
/*843ms,2288KB*/
#include <cstdio>
#include <algorithm>
using namespace std;
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
#define root 1, n, 1
const int maxn = 100000;
int sum[maxn << 2], cache[maxn << 2];
inline void pushup(int rt)
{
sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
}
inline void pushdown(int rt, int m)
{
if (cache[rt])
{
cache[rt << 1] = cache[rt << 1 | 1] = cache[rt];///更新左右子区间cache
sum[rt << 1] = (m - (m >> 1)) * cache[rt];
sum[rt << 1 | 1] = (m >> 1) * cache[rt];///平分cache,更新左右子区间和
cache[rt] = 0;
}
}
void build(int l, int r, int rt)
{
cache[rt] = 0;
sum[rt] = 1;
if (l == r) return;
int m = (l + r) >> 1;
build(lson);
build(rson);
pushup(rt);
}
void update(int ql, int qr, int c, int l, int r, int rt)
{
if (ql <= l && r <= qr)
{
cache[rt] = c;
sum[rt] = c * (r - l + 1);
return;
}
///打开上层acahe,往下细分计算
pushdown(rt , r - l + 1);
int m = (l + r) >> 1;
if (ql <= m) update(ql , qr , c , lson);
if (qr > m) update(ql , qr , c , rson);
pushup(rt);
}
int main()
{
int T, n, m, a, b, c;
scanf("%d", &T);
for (int cas = 1 ; cas <= T ; cas ++)
{
scanf("%d%d", &n, &m);
build(root);
while (m--)
{
scanf("%d%d%d", &a, &b, &c);
update(a, b, c, root);
}
printf("Case %d: The total value of the hook is %d.\n", cas, sum[1]);
}
return 0;
}

本文提供了一种解决HDU 1698问题的有效方法,使用了线段树数据结构实现区间更新操作。通过递归地构建和更新线段树,可以在O(log N)的时间复杂度内完成区间更新。
466

被折叠的 条评论
为什么被折叠?



