HDU 1556【线段树区间更新】
这篇lazy讲的很棒:
https://www.douban.com/note/273509745/
if(tree[rt].l == l && r == tree[rt].r)
这里就是用到Lazy思想的关键时刻 正如上面说提到的,这里首先更新该节点的sum[rt]值,
然后更新该节点具体每个数值应该加多少即add[rt]的值,
注意此时整个函数就运行完了,直接return,而不是还继续向子节点继续更新,
这里就是Lazy思想,暂时不更新子节点的值。
那么什么时候需要更新子节点的值呢?
答案是在某部分update操作的时候需要用到那部分没有更新的节点的值的时候,
这时就掉用PushDown()函数更新子节点的数值。
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
struct asd{
int left,right;
int ad;
int w;
};
asd q[N*4];
void build(int num,int L,int R)
{
q[num].left=L;
q[num].right=R;
if(L==R)
{
q[num].w=q[num].ad=0;
return;
}
build(2*num,L,(L+R)/2);
build(2*num+1,(L+R)/2+1,R);
q[num].w=q[num].ad=0;
}
int ss(int num)
{
return q[num].right-q[num].left+1;
}
void Pushdown(int num)
{
if(q[num].ad)
{
q[num*2].w+=q[num].ad*(ss(2*num));
q[num*2+1].w+=q[num].ad*(ss(2*num+1));
q[num*2].ad+=q[num].ad;
q[num*2+1].ad+=q[num].ad;
q[num].ad=0;
}
}
void Pushup(int num)
{
q[num].w=q[2*num].w+q[2*num+1].w;
}
void update(int num,int s,int t)
{
if(s==q[num].left&&q[num].right==t)
{
q[num].w+=t-s+1;
q[num].ad+=1;
return;
}
if(q[num].left==q[num].right)
return;
Pushdown(num);
int mid=(q[num].right+q[num].left)/2;
if(mid>=t)
update(2*num,s,t);
else if(mid<s)
update(2*num+1,s,t);
else
{
update(2*num,s,mid);
update(2*num+1,mid+1,t);
}
Pushup(num);
}
int query(int num,int s,int t)
{
if(s==q[num].left&&q[num].right==t)
return q[num].w;
Pushdown(num);
int ans=0;
int mid=(q[num].right+q[num].left)/2;
if(mid>=t)
ans+=query(2*num,s,t);
else if(mid<s)
ans+=query(2*num+1,s,t);
else
ans+=query(2*num,s,mid)+query(2*num+1,mid+1,t);
return ans;
}
int main()
{
int n;
while(~scanf("%d",&n)&&n)
{
int x,y;
build(1,1,n);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&x,&y);
update(1,x,y);
}
for(int i=1;i<=n;i++)
{
if(i>1) printf(" ");
printf("%d",query(1,i,i));
}
puts("");
}
return 0;
}
/*
6
1 6
1 6
1 6
1 3
2 5
3 6
*/
HDU 1556【线段树区间更新】的更多相关文章
- HDU 1698 线段树 区间更新求和
一开始这条链子全都是1 #include<stdio.h> #include<string.h> #include<algorithm> #include<m ...
- hdu 1698 线段树 区间更新 区间求和
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU(1698),线段树区间更新
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1698 区间更新重点在于懒惰标记. 当你更新的区间就是整个区间的时候,直接sum[rt] = c*(r- ...
- HDU 1698 (线段树 区间更新) Just a Hook
有m个操作,每个操作 X Y Z是将区间[X, Y]中的所有的数全部变为Z,最后询问整个区间所有数之和是多少. 区间更新有一个懒惰标记,set[o] = v,表示这个区间所有的数都是v,只有这个区间被 ...
- hdu 1556 线段树区间延迟更新好题
656mS #include<stdio.h> #include<stdlib.h> #define N 110000 struct node { int x,y,yanchi ...
- HDU 3016 线段树区间更新+spfa
Man Down Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- HDU.1556 Color the ball (线段树 区间更新 单点查询)
HDU.1556 Color the ball (线段树 区间更新 单点查询) 题意分析 注意一下pushdown 和 pushup 模板类的题还真不能自己套啊,手写一遍才行 代码总览 #includ ...
- HDU 1556 Color the ball(线段树区间更新)
Color the ball 我真的该认真的复习一下以前没懂的知识了,今天看了一下线段树,以前只会用模板,现在看懂了之后,发现还有这么多巧妙的地方,好厉害啊 所以就应该尽量搞懂 弄明白每个知识点 [题 ...
- HDU 5023 A Corrupt Mayor's Performance Art(线段树区间更新)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5023 解题报告:一面墙长度为n,有N个单元,每个单元编号从1到n,墙的初始的颜色是2,一共有30种颜色 ...
- HDU 4902 Nice boat 2014杭电多校训练赛第四场F题(线段树区间更新)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4902 解题报告:输入一个序列,然后有q次操作,操作有两种,第一种是把区间 (l,r) 变成x,第二种是 ...
随机推荐
- 基于TCP的一对回射客户/服务器程序及其运行过程分析( 下 )
执行分析 1. 打开服务器进程: 2. 执行netstat -a命令观察当前的连接状态: 第1条连接记录说明:绑定了本地主机的任意IP,端口为9877,目前处于监听状态. 3. 打开客户进程: 4. ...
- Drupal 初次使用感受,兴许补充。
非常久曾经就接触过.下载下来安装,结果界面太丑,太难看,直接删除. 近期又一次想到开源CMS,好奇看到那么多人推崇drupal.也便下载来又一次研究了下. 刚接触了下.只是总体使用感觉非常差.尤其几个 ...
- javascript正则表达式提取子匹配项
C#里所用的正则表达式,如果要提取字符串里的子匹配项(我都不知道那个叫啥名字,别名?)是很方便的,比如: Regex rx = new Regex(@"<title>(?< ...
- 让EasyDarwin只支持RTP over TCP传输
我们经常需要EasyDarwin服务器支持公网流媒体传输,但很多时候,播放器默认都是通过RTP over UDP的形式在RTSP SETUP中请求,往往都以在内网接收不到UDP数据失败结束,那么我们如 ...
- BitMapFactory.decodeFile 总是返回NULL的原因之一
之前碰到过,顺便记录下来,如果出现这种情况,首先看看是否有对这个文件的读权限.
- 关于Fragment的onActivityResult 不执行
1.getActivity().startActivityForResult(); 与 fragment.startActivityForActivity(): getActivity().star ...
- Linux-正则表达式学习(精)
正则表达式30分钟入门教程 来园子之前写的一篇正则表达式教程,部分翻译自codeproject的The 30 Minute Regex Tutorial. 由于评论里有过长的URL,所以本页排版比较混 ...
- ffmpeg 编码h264 profile如何设置为baseline的问题
http://blog.csdn.net/kisaa133/article/details/7792008 使用最新版ffmpeg-0.11 libx264-125,使用默认编码时,用Eyecard发 ...
- NSMutableURLRequest,在POST方式下传递参数
1. [代码][C/C++]代码 NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; NSUs ...
- poj 3617 Best Cow Line 解题报告
题目链接:http://poj.org/problem?id=3617 题目意思:给出一条长度为n的字符串S,目标是要构造一条字典序尽量小,长度为n的字符串T.构造的规则是,如果S的头部的字母 < ...