HDU1698 just a Hook - 带有lazy标记的线段树
2017-08-30 16:44:33
writer:pprp
上午刚刚复习了一下不带有lazy标记的线段树,
下午开始学带有lazy标记的线段树
这个是我看大佬代码敲的,但是出了很多问题,
这提醒我:
1、要注意边界条件,一个边界条件的取等或者不取等,小于或者大于出错的话就直接运行不了了
2、注意输入输出,经过多次测试,果然还是用scanf比较保险,试了试用fast_io的cin结果还是TLE
所以以后不要用cin了,cin害人啊,两个混用就更加麻烦了
这个题就是区间修改,区间查询的一道题,但是大佬没有用指针构造一个结构体
仅仅抽象了一个sum和一个add(lazy标记)
感觉简单了不少
代码如下:
/*
@theme:segmentation/interval tree
@writer:pprp
@begin:15:26
@end:16:13
@declare: 使用lazy标记的线段树,HDU 1698
@date:2017/8/30
*/ #include <iostream>
#include <cstdio>
#define Mid ((l+r)>>1)
#define lson rt<<1,l,Mid
#define rson rt<<1|1,Mid+1,r
const int maxn = ;
int sum[maxn<<],add[maxn<<]; using namespace std; void build(int rt,int l, int r)
{
add[rt] = ;
//这里是每个节点都是1的情况
if(l == r)
sum[rt] = ;
else
{
build(rson);
build(lson);
sum[rt] = sum[rt<<]+sum[rt<<|];
}
} void pushDown(int rt, int len)
{
//将父节点的add值传递下来
add[rt<<] = add[rt<<|] = add[rt];
//将左右的值进行区间更新
sum[rt<<] = (len - (len>>))*add[rt];
sum[rt<<|] = (len>>)*add[rt];
//将父节点的add值清空
add[rt] =;
} //L,R代表的要更新区间的左右端点,z是区间增加的值
void update(int rt, int l,int r, int L, int R, int z)
{
//如果在L,R的内部
if(L <= l && r <= R) //error before
{
add[rt] = z;
sum[rt] = (r - l + ) * z;
}
else //没有找到该节点
{
if(add[rt])//当前节点不为空,要传下去
pushDown(rt,r-l+);
if(L <= Mid)
update(lson,L,R,z);
if(R > Mid) //error before
update(rson,L,R,z);
sum[rt] = sum[rt<<]+sum[rt<<|];
}
} int main()
{
// RE;
int t,n,q,x,y,z;
int cnt=;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&q);
build(,,n);
while(q--){
scanf("%d%d%d",&x,&y,&z);
update(,,n,x,y,z);
}
printf("Case %d: The total value of the hook is %d.\n", cnt++,sum[]);
}
return ;
}
HDU1698 just a Hook - 带有lazy标记的线段树的更多相关文章
- HDU 1698 just a hook - 带有lazy标记的线段树(用结构体实现)
2017-08-30 18:54:40 writer:pprp 可以跟上一篇博客做个对比, 这种实现不是很好理解,上一篇比较好理解,但是感觉有的地方不够严密 代码如下: /* @theme:segme ...
- 带有lazy标记的线段树
#include<bits/stdc++.h> using namespace std; ]; struct st{ int l,r,val,add; }tr[]; void build( ...
- kuangbin专题七 HDU1698 Just a Hook (区间设值 线段树)
In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of the heroes. T ...
- [HDU5306]Gorgeous Sequence(标记回收线段树)
题意:维护一个序列,支持区间与一个数取min,询问区间最大,询问区间和(序列长度<=1e6) 分析: http://www.shuizilong.com/house/archives/hdu-5 ...
- [hdoj4578][多延迟标记的线段树]
Transformation Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 65535/65536 K (Java/Others)T ...
- 洛谷 1083 (NOIp2012) 借教室——标记永久化线段树 / 差分+二分
题目:https://www.luogu.org/problemnew/show/P1083 听说线段树不标记永久化会T一个点. 注意mn记录的是本层以下.带上标记的min! #include< ...
- HDU 1698 Just a Hook(线段树 区间替换)
Just a Hook [题目链接]Just a Hook [题目类型]线段树 区间替换 &题解: 线段树 区间替换 和区间求和 模板题 只不过不需要查询 题里只问了全部区间的和,所以seg[ ...
- poj 3468 A Simple Problem with Integers (线段树区间更新求和lazy思想)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 75541 ...
- Codeforces 444C 线段树 懒惰标记
前天晚上的CF比赛div2的E题,很明显一个线段树,当时还在犹豫复杂度的问题,因为他是区间修改和区间查询,肯定是要用到懒惰标记. 然后昨天真的是给这道题跪了,写了好久好久,...我本来是写了个add标 ...
随机推荐
- react native 或 flutter 开发app
react-native react native和原生Android/ios: https://www.oschina.net/news/97466/should-we-use-react-nati ...
- struts2之Action获取请求参数与web元素
文章思路清晰 http://blog.csdn.net/zeqblog/article/details/8665052
- docker安装入门
docker安装入门 https://blog.csdn.net/earbao/article/details/49683175
- Oracle 学习笔记 12 -- 序列、索引、同义词
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/Topyuluo/article/details/24232449 数据库的对象包含:表.视图.序列. ...
- DotNet Core全新认识
一.概述 .NET 经历14年,在Windows平台上的表现已经相当优秀,但是“跨平台.开源”却是其痛点,从16年开始.NET Core的出现将迎来.NET的真正意义上的跨平台和开源序幕. ...
- 如何进入单用户模式(CentOS6.9)
环境: CentOS6.9_64位 步骤1 虚拟机此时处在关机模式,开机后在下图界面4秒倒计时结束前,按 e 步骤2 此时会进入下图所示界面,接着按一下 e 步骤3 此时会进入下图所示的界面,选择第2 ...
- APP移动端自动化测试工具选型“兵器谱”一览(主流开源工具)
(下面大多数工具都是开源工具,在github,码云等开源平台都能找到) "测试那点事儿”在看到360旗下的测试团队整理的关于目前APP移动端自动化相关的工具,觉得总结的很到位,对目前大多数中 ...
- Oracle记录登录失败的触发器
前言:实现的功能主要是,oracle登录成功记录登录用户ip地址,登录失败记录登录失败ip地址 1,需要建立一个触发器记录登录成功的客户端用户的ip地址 大家都知道在v$session 中记录着客户端 ...
- python手写神经网络实现识别手写数字
写在开头:这个实验和matlab手写神经网络实现识别手写数字一样. 实验说明 一直想自己写一个神经网络来实现手写数字的识别,而不是套用别人的框架.恰巧前几天,有幸从同学那拿到5000张已经贴好标签的手 ...
- JDK环境变量配置目录jre,jvm
类路径 :CLASSPATH= .;%JAVA_HOME%/lib/dt.jar;%JAVA_HOME%/lib/tools.jar JDK的路径:JAVA_HOME = C:/Program F ...