上午理论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操作】的更多相关文章

  1. poj3468 线段树+lazy标记

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 92921   ...

  2. HDU 3954 Level up(多颗线段树+lazy操作)

    又是一开始觉得的水题,结果GG了好久的东西... 题意是给你n个英雄,每个英雄开始为1级经验为0,最多可以升到k级并且经验一直叠加,每一级都有一个经验值上限,达到就升级.接着给你两种操作:W li r ...

  3. poj 3237 树链剖分模板(用到线段树lazy操作)

    /* 本体在spoj375的基础上加了一些操作,用到线段树的lazy操作模板类型 */ #include<stdio.h> #include<string.h> #includ ...

  4. hdoj1698【线段树Lazy操作】

    区间更新lazy操作一发. #include<cstdio> #include<iostream> #include<string.h> #include<a ...

  5. 分块+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 ...

  6. 线段树+lazy标记 2019年8月10日计蒜客联盟周赛 C.小A的题

    题目链接:https://nanti.jisuanke.com/t/40852 题意:给定一个01串s,进行m次操作,|s|<=1e6,m<=5e5 操作有两种 l r 0,区间[l,r] ...

  7. POJ 2777——线段树Lazy的重要性

    POJ 2777 Count Color --线段树Lazy的重要性 原题 链接:http://poj.org/problem?id=2777 Count Color Time Limit: 1000 ...

  8. JuQueen(线段树 lazy)

    JuQueen Time Limit: 5 Sec  Memory Limit: 512 MB Description Input Output Sample Input 10 10 5 state ...

  9. hdu 2871 线段树(各种操作)

    Memory Control Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

随机推荐

  1. angularjs中下拉框select option默认值

    1.问题说明: option ng-repeat多空白项 2.解决方案: html: <ion-view hide-nav-bar="true"> <ion-co ...

  2. hdu5289(2015多校1)--Assignment(单调队列)

    Assignment Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total ...

  3. App反编译二次打包常见问题处理

    1.二次打包时报错:Error retrieving parent for item: No resource found that matches the given name 如: D:\用户文件 ...

  4. thinkphp getField( )和field( )

    thinkphp getField( )和field( )   做数据库查询的时候,比较经常用到这两个,总是查手册,记不住,现在把它总结下,希望以后用的时候不查手册了. 不管是用select 查询数据 ...

  5. Python2.7安装教程

    作者:zhanhailiang 日期:2014-11-16 [root@~/software]# yum install bzip* [root@~/software]# wget http://ww ...

  6. JAVA运行时异常及常见的5中RuntimeExecption

    最近在抽时间看面试题,很多面试题都提出了写出java常见的5个运行时异常.现在来总结一下, java运行时异常是可能在java虚拟机正常工作时抛出的异常. java提供了两种异常机制.一种是运行时异常 ...

  7. TGraphiControl响应WM_MOUSEMOVE的过程(以TPaintBox为例)good

    起因:非Windows句柄控件也可以处理鼠标消息,我想知道是怎么处理的:并且想知道处理消息的顺序(比如TPaintBox和TForm都响应WM_Mouse消息该怎么办)界面:把TPaintBox放到T ...

  8. SharePoint 2010 Pop-Up Dialogs SharePoint 2010 弹出对话框

    SharePoint 2010 Pop-Up Dialogs SharePoint 2010 弹出对话框         SharePoint 2010 使得往你的站点加入对话框内容变得出乎意料的简单 ...

  9. vi编辑器设置行号可见

    vi 设置行号 需要切换到命令模式下,输入set number :set number 按下回车即可

  10. 【转】Java数字抽奖游戏核心代码

    1. [代码][Java]代码    package com.luiszhang.test; import java.util.Arrays; /** * NumberLotteryGame * 一个 ...