poj 3468(线段树+lazy思想)
题目链接:http://poj.org/problem?id=3468
思路:如果直接去做,每次都更新到叶子节点,那必然会TLE,我们可以采用lazy的思想:没必要每次更新都更新到叶子节点,只要有一个合适的范围就用一个增量来记录它,当下一次询问时,如果这个范围正好合适询问的范围,就直接是这个节点的sum值加上这个区间长度*lnc,再加到总和上去,若这个节点的范围不适合所要查询的范围,那么就要查询它的子节点,这个时候再把增量传给她的子节点,并且清空父亲节点的增量,这样效率能大大提高。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 100010
typedef long long ll; struct Node{
int L,R;
ll lnc;//增量
ll sum;
}node[MAXN<<]; int N,Q; void Build(int L,int R,int rt)
{
if(L==R){
node[rt].lnc=node[rt].sum=;
return ;
}
node[rt].lnc=node[rt].sum=;
int M=(L+R)>>;
Build(L,M,rt<<);
Build(M+,R,(rt<<)|);
} void Updata(int L,int R,int rt,int id,ll x)
{
if(L==id&&R==id){
node[rt].sum=x;
return ;
}
node[rt].sum+=x;
int M=(L+R)>>;
if(id<=M){
Updata(L,M,rt<<,id,x);
}else
Updata(M+,R,(rt<<)|,id,x);
} void Add_Updata(int L,int R,int rt,int l,int r,ll x)
{
if(l<=L&&R<=r){
node[rt].lnc+=x;//若此节点所在区段被包含在要插入的区段中,就将插入值存在lnc中,return;
return ;
}else if(L<=l&&r<=R){
node[rt].sum+=(r-l+)*x;
}else if(L>=l&&R>=r){
node[rt].sum+=(r-L+)*x;
}else if(L<=l&&R<=r){
node[rt].sum+=(R-l+)*x;
}
int M=(L+R)>>;
if(r<=M){
Add_Updata(L,M,rt<<,l,r,x);
}else if(l>M){
Add_Updata(M+,R,(rt<<)|,l,r,x);
}else {
Add_Updata(L,M,rt<<,l,r,x);
Add_Updata(M+,R,(rt<<)|,l,r,x);
}
} ll sum;
void Query(int L,int R,int rt,int l,int r)
{
if(l<=L&&R<=r){
sum+=node[rt].sum+node[rt].lnc*(R-L+);
return ;
}
//若上面if条件不成立,则要询问它的子节点,此时增量要下传,并且要更新其本身的sum;
node[rt<<].lnc+=node[rt].lnc;
node[(rt<<)|].lnc+=node[rt].lnc;
node[rt].sum+=node[rt].lnc*(R-L+);
node[rt].lnc=;
int M=(L+R)>>;
if(r<=M){
Query(L,M,rt<<,l,r);
}else if(l>M){
Query(M+,R,(rt<<)|,l,r);
}else {
Query(L,M,rt<<,l,r);
Query(M+,R,(rt<<)|,l,r);
}
} int main()
{
int a,b,c;
char str[];
scanf("%d%d",&N,&Q);
Build(,N,);
for(int i=;i<=N;i++){
scanf("%d",&a);
Updata(,N,,i,(ll)a);
}
while(Q--){
scanf("%s",str);
if(str[]=='Q'){
scanf("%d%d",&a,&b);
sum=;
Query(,N,,a,b);
printf("%lld\n",sum);
}else {
scanf("%d%d%d",&a,&b,&c);
Add_Updata(,N,,a,b,(ll)c);
}
}
return ;
}
poj 3468(线段树+lazy思想)的更多相关文章
- poj 2777(线段树+lazy思想) 小小粉刷匠
http://poj.org/problem?id=2777 题目大意 涂颜色,输入长度,颜色总数,涂颜色次数,初始颜色都为1,然后当输入为C的时候将x到y涂为颜色z,输入为Q的时候输出x到y的颜色总 ...
- POJ 2777——线段树Lazy的重要性
POJ 2777 Count Color --线段树Lazy的重要性 原题 链接:http://poj.org/problem?id=2777 Count Color Time Limit: 1000 ...
- hdu 1698+poj 3468 (线段树 区间更新)
http://acm.hdu.edu.cn/showproblem.php?pid=1698 这个题意翻译起来有点猥琐啊,还是和谐一点吧 和涂颜色差不多,区间初始都为1,然后操作都是将x到y改为z,注 ...
- poj 3468(线段树)
http://poj.org/problem?id=3468 题意:给n个数字,从A1 …………An m次命令,Q是查询,查询a到b的区间和,c是更新,从a到b每个值都增加x.思路:这是一个很明显的线 ...
- C - A Simple Problem with Integers POJ - 3468 线段树模版(区间查询区间修改)
参考qsc大佬的视频 太强惹 先膜一下 视频在b站 直接搜线段树即可 #include<cstdio> using namespace std; ; int n,a[maxn]; stru ...
- POJ 3468 线段树+状压
题意:给你n个数,有对区间的加减操作,问某个区间的和是多少. 思路:状压+线段树(要用lazy标记,否则会TLE) //By SiriusRen #include <cstdio> #in ...
- POJ - 3468 线段树单点查询,单点修改区间查询,区间修改模板(求和)
题意: 给定一个数字n,表示这段区间的总长度.然后输入n个数,然后输入q,然后输入a,b,表示查询a,b,区间和,或者输入c 再输入三个数字a,b,c,更改a,b区间为c 思路: 线段树首先就是递归建 ...
- POJ 3468 线段树裸题
这些天一直在看线段树,因为临近期末,所以看得断断续续,弄得有些知识点没能理解得很透切,但我也知道不能钻牛角尖,所以配合着刷题来加深理解. 然后,这是线段树裸题,而且是最简单的区间增加与查询,我参考了A ...
- poj 3468 线段树区间更新/查询
Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...
随机推荐
- iOS耳机操作
iOS在7之后增加的麦克风权限的申请,代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 AVAudioSession *avSession = [AVAudioSession shar ...
- EntityFramwork(2Database First) 源地址https://msdn.microsoft.com/zh-cn/data/jj193542
必备条件 要完成本演练,需要安装 Visual Studio 2010 或 Visual Studio 2012. 如果使用的是 Visual Studio 2010,还需要安装 NuGet. ...
- bootstrap-fileinput 图片上传
bootstrap-fileinput 源文件 在网上下载 CSS: <link href="../../static/Bootstrap/css/plugins/bootstrap- ...
- 单点登录 关于Cookie跨域的问题
public void ProcessRequest(HttpContext context) { HttpCookie cookie = new HttpCookie("name" ...
- mysql查询重复
select * from tablename where id in ( select id from tablename group by id having count(id) ...
- 学习jax-ws(一)
1.生成文件时提示class not find ,需要加个cp .,这样就行了 E:\mylearn\learn_webservice\learnJax-ws\bin>wsgen -cp . w ...
- [转] Matlab中给信号加高斯白噪声的方法
MATLAB中产生高斯白噪声非常方便,可以直接应用两个函数,一个是WGN,另一个是AWGN.WGN用于产生高斯白噪声,AWGN则用于在某一信号中加入高斯白噪声. 1. WGN:产生高斯白噪声 y = ...
- VBS数组函数学习实例分析
Array 函数 返回包含数组的Variant. Array(arglist) 参数:arglist是赋给包含在Variant中的数组元素的值的列表(用逗号分隔).如果没有指定此参数,则将会创建零长度 ...
- 理解bashrc和profile[转载]
这儿有一篇文章不错 https://wido.me/sunteya/understand-bashrc-and-profile/ http://blog.csdn.net/luotuo44/artic ...
- 【转】android ListView 几个重要属性
android ListView 几个重要属性 分类: Android2012-03-08 19:25 19324人阅读 评论(5) 收藏 举报 listviewandroid活动javalistnu ...