博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDOJ 1698 Just a Hook(线段树成段更新)
阅读量:5118 次
发布时间:2019-06-13

本文共 1687 字,大约阅读时间需要 5 分钟。

题意:

屠夫的钩子区间是1~n,每段可能由铜,银,金组成,价值分别为1,2,3,进行一系列的更新之后,求钩子的总价值。

思路:

线段树的成段更新:要设置一个临时的线段树,每次更新的时候把更新段的值放在临时数组中,等到下次更新线段树的时候再向下更新(延迟更新)

 

#include 
#define lhs l, m, rt << 1#define rhs m + 1, r, rt << 1 | 1const int maxn = 100010;int seg[maxn << 2];int col[maxn << 2];void PushUp(int rt){
seg[rt] = seg[rt << 1] + seg[rt << 1 | 1];}void PushDown(int rt, int len){
if (col[rt] > 0) {
col[rt << 1] = col[rt << 1 | 1] = col[rt]; seg[rt << 1] = (len - (len >> 1)) * col[rt]; seg[rt << 1 | 1] = (len >> 1) * col[rt]; col[rt] = 0; }}void Build(int l, int r, int rt){
col[rt] = 0; if (l == r) seg[rt] = 1; else {
int m = (l + r) >> 1; Build(lhs); Build(rhs); PushUp(rt); }}void Update(int beg, int end, int value, int l, int r, int rt){
if (beg <= l && r <= end) {
col[rt] = value; seg[rt] = (r - l + 1) * value; } else {
PushDown(rt, r - l + 1); int m = (l + r) >> 1; if (beg <= m) Update(beg, end, value, lhs); if (end > m) Update(beg, end, value, rhs); PushUp(rt); }}int main(){
int cases, cnt = 0; scanf("%d", &cases); while (cases--) {
int n, q; scanf("%d %d", &n, &q); Build(1, n, 1); for (int i = 0; i < q; ++i) {
int a, b, c; scanf("%d %d %d", &a, &b, &c); Update(a, b, c, 1, n, 1); } printf("Case %d: The total value of the hook is %d.\n", ++cnt, seg[1]); } return 0;}

转载于:https://www.cnblogs.com/kedebug/archive/2013/01/13/2858324.html

你可能感兴趣的文章
ubuntu无法解析主机错误与解决的方法
查看>>
尚学堂Java面试题整理
查看>>
MySQL表的四种分区类型
查看>>
[BZOJ 3489] A simple rmq problem 【可持久化树套树】
查看>>
STM32单片机使用注意事项
查看>>
swing入门教程
查看>>
好莱坞十大导演排名及其代表作,你看过多少?
查看>>
Loj #139
查看>>
hihocoder1187 Divisors
查看>>
Azure 托管镜像和非托管镜像对比
查看>>
js window.open 参数设置
查看>>
032. asp.netWeb用户控件之一初识用户控件并为其自定义属性
查看>>
Ubuntu下安装MySQL及简单操作
查看>>
前端监控
查看>>
clipboard.js使用方法
查看>>
移动开发平台-应用之星app制作教程
查看>>
leetcode 459. 重复的子字符串(Repeated Substring Pattern)
查看>>
伪类与超链接
查看>>
centos 7 redis-4.0.11 主从
查看>>
博弈论 从懵逼到入门 详解
查看>>