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 ...
随机推荐
- angularjs中下拉框select option默认值
1.问题说明: option ng-repeat多空白项 2.解决方案: html: <ion-view hide-nav-bar="true"> <ion-co ...
- hdu5289(2015多校1)--Assignment(单调队列)
Assignment Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...
- App反编译二次打包常见问题处理
1.二次打包时报错:Error retrieving parent for item: No resource found that matches the given name 如: D:\用户文件 ...
- thinkphp getField( )和field( )
thinkphp getField( )和field( ) 做数据库查询的时候,比较经常用到这两个,总是查手册,记不住,现在把它总结下,希望以后用的时候不查手册了. 不管是用select 查询数据 ...
- Python2.7安装教程
作者:zhanhailiang 日期:2014-11-16 [root@~/software]# yum install bzip* [root@~/software]# wget http://ww ...
- JAVA运行时异常及常见的5中RuntimeExecption
最近在抽时间看面试题,很多面试题都提出了写出java常见的5个运行时异常.现在来总结一下, java运行时异常是可能在java虚拟机正常工作时抛出的异常. java提供了两种异常机制.一种是运行时异常 ...
- TGraphiControl响应WM_MOUSEMOVE的过程(以TPaintBox为例)good
起因:非Windows句柄控件也可以处理鼠标消息,我想知道是怎么处理的:并且想知道处理消息的顺序(比如TPaintBox和TForm都响应WM_Mouse消息该怎么办)界面:把TPaintBox放到T ...
- SharePoint 2010 Pop-Up Dialogs SharePoint 2010 弹出对话框
SharePoint 2010 Pop-Up Dialogs SharePoint 2010 弹出对话框 SharePoint 2010 使得往你的站点加入对话框内容变得出乎意料的简单 ...
- vi编辑器设置行号可见
vi 设置行号 需要切换到命令模式下,输入set number :set number 按下回车即可
- 【转】Java数字抽奖游戏核心代码
1. [代码][Java]代码 package com.luiszhang.test; import java.util.Arrays; /** * NumberLotteryGame * 一个 ...