POJ3468【线段树lazy操作】
上午理论AC,打到现在快吐了。。。
一个那么**Lazy操作打成这样,query操作和update操作都有问题,妈蛋,发现是mid<=s+1…真是蠢到家,明明是mid+1<=s卧槽连左和右都分不清。。。
什么是lazy?
lazy做法:
查询一个区间,如果这个节点的区间正好是满足,那么直接返回,眼睛都不眨一下,如果不是,就要让根的标志和他的子节点搞一搞,然后继续分下去,判断与mid的关系,因为是从根节点下去,所以他肯定是满足区间的,只是怎么分的问题,有两个是区间变小,分别是查询区间完全在mid右边和左边,还有就是mid就在区间里面那么切一切就好了。同理更新啊。。。。。。。。。瞎瘠薄搞吧,巨巨,画个树,然后拿各种区间,分分看就知道了。
贴上我的挫code………………..
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
const int INF=-0x3f3f3f3f;
const int N=100000;
struct st{
LL left,right;
LL sum;
LL val; //对该节点的下一层子节点而言的,不是对于其本身,所以其本身要本来就加上了这个value;
};
st q[N*4];
LL n;
int m;
void build(int num,LL L,LL R)
{
q[num].left=L;
q[num].right=R;
q[num].val=0;
if(L==R)
{
scanf("%I64d",&q[num].sum);
return;
}
build(2*num,L,(L+R)/2);
build(2*num+1,(L+R)/2+1,R);
q[num].sum=q[2*num].sum+q[2*num+1].sum;
}
void update(int num,LL s,LL t,LL x)
{
if(q[num].left==s&&q[num].right==t)
{
q[num].val+=x;
q[num].sum+=x*(q[num].right-q[num].left+1);
return;
}
if(q[num].left==q[num].right) return;
if(q[num].val)
{
q[2*num].val+=q[num].val;
q[2*num].sum+=q[num].val*(q[2*num].right-q[2*num].left+1);
q[2*num+1].val+=q[num].val;
q[2*num+1].sum+=q[num].val*(q[2*num+1].right-q[2*num+1].left+1);
q[num].val=0;
}
LL mid=(q[num].left+q[num].right)/2;
if(mid>=t)
update(2*num,s,t,x);
else if(mid+1<=s)
update(2*num+1,s,t,x);
else{
update(2*num,s,mid,x);
update(2*num+1,mid+1,t,x);
}
q[num].sum=q[2*num].sum+q[2*num+1].sum;
}
LL query(int num,LL s,LL t)
{
if(q[num].left==s&&q[num].right==t)
return q[num].sum;
if(q[num].val)
{
q[2*num].val+=q[num].val;
q[2*num].sum+=q[num].val*(q[2*num].right-q[2*num].left+1);
q[2*num+1].val+=q[num].val;
q[2*num+1].sum+=q[num].val*(q[2*num+1].right-q[2*num+1].left+1);
q[num].val=0;
}
LL ans=0;
LL mid=(q[num].left+q[num].right)/2;
if(mid>=t)
ans+=query(2*num,s,t);
else if(mid+1<=s)
ans+=query(2*num+1,s,t);
else{
ans+=query(2*num,s,mid);
ans+=query(2*num+1,mid+1,t);
}
return ans;
}
int main()
{
scanf("%I64d%d",&n,&m);
build(1,1,n);
while(m--)
{
char ss[5];
LL a,b,c;
scanf("%s",ss);
if(strcmp(ss,"Q")==0)
{
scanf("%I64d%I64d",&a,&b);
printf("%I64d\n",query(1,a,b));
}
else{
scanf("%I64d%I64d%I64d",&a,&b,&c);
update(1,a,b,c);
}
}
return 0;
}
POJ3468【线段树lazy操作】的更多相关文章
- poj3468 线段树+lazy标记
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 92921 ...
- HDU 3954 Level up(多颗线段树+lazy操作)
又是一开始觉得的水题,结果GG了好久的东西... 题意是给你n个英雄,每个英雄开始为1级经验为0,最多可以升到k级并且经验一直叠加,每一级都有一个经验值上限,达到就升级.接着给你两种操作:W li r ...
- poj 3237 树链剖分模板(用到线段树lazy操作)
/* 本体在spoj375的基础上加了一些操作,用到线段树的lazy操作模板类型 */ #include<stdio.h> #include<string.h> #includ ...
- hdoj1698【线段树Lazy操作】
区间更新lazy操作一发. #include<cstdio> #include<iostream> #include<string.h> #include<a ...
- 分块+lazy 或者 线段树+lazy Codeforces Round #254 (Div. 2) E
E. DZY Loves Colors time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- 线段树+lazy标记 2019年8月10日计蒜客联盟周赛 C.小A的题
题目链接:https://nanti.jisuanke.com/t/40852 题意:给定一个01串s,进行m次操作,|s|<=1e6,m<=5e5 操作有两种 l r 0,区间[l,r] ...
- POJ 2777——线段树Lazy的重要性
POJ 2777 Count Color --线段树Lazy的重要性 原题 链接:http://poj.org/problem?id=2777 Count Color Time Limit: 1000 ...
- JuQueen(线段树 lazy)
JuQueen Time Limit: 5 Sec Memory Limit: 512 MB Description Input Output Sample Input 10 10 5 state ...
- hdu 2871 线段树(各种操作)
Memory Control Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
随机推荐
- c程序设计语言第一章5
练习1.20请编写程序d e t a b
- 【转载】C#之C#、.NET Framework、CLR的关系
C#..NET Framework.CLR的关系 很多人没有将C#..NET Framework(.NET框架).CLR(Common Language Runtime,公共语言运行库)这三者之间的关 ...
- poj2595(凸包)
Min-Max Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2192 Accepted: 502 Descriptio ...
- Linux变量内容的删除、代替与替换
变量内容的删除与代替 范例一:先让小写的 path 自己定义变量配置的与 PATH 内容同样 [root@www ~]# path=${PATH} [root@www ~]# echo $path / ...
- region split流程分析
region split流程分析 splitregion的发起主要通过client端调用regionserver.splitRegion或memstore.flsuh时检查并发起. Client通过r ...
- python day- 5 字典(dic)的 增删改查 及 操作方法
字典(dic) 1.定义及格式 用{ }大括号括起来的,由key:value 来保存数据的就是 字典(dic) eg:dic = {"及时雨" : "宋江" , ...
- CentOS笔记-yum
yum( Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器. yum [options] [command] [p ...
- AMQP 0-9-1 Model Explained Why does the queue memory grow and shrink when publishing/consuming? AMQP和AMQP Protocol的是整体和部分的关系 RabbitMQ speaks multiple protocols.
AMQP 0-9-1 Model Explained — RabbitMQ http://next.rabbitmq.com/tutorials/amqp-concepts.html AMQP 0-9 ...
- springboot实现定时任务的两种方式
方式一:在springboot启动类上添加@EnableScheduling注解,然后创建具体的任务类,在方法上添加@Scheduled注解,并指明执行频率即可.如下: @Componentpubli ...
- JVM学习资料收集
JVM实用参数(一)JVM类型以及编译器模式 http://ifeve.com/useful-jvm-flags-part-1-jvm-types-and-compiler-modes-2/ JVM实 ...