PS:思路来源于Clove_unique的博客,在此万分感谢

这道题可以用树状数组轻松过,然而...树状数组不太熟悉,还是用线段树比较好(虽然代码比较长)

【思路分析】

【一开始的思路】
最开始的错误想法:当作一般的区间覆盖题来做(顺便吐槽了一波这题太睿(ruo)智了),但写到一半突然发现,真正睿智的人是我...因为直接做的话,同一种树程序会当做不同的树来做,直接无脑相加导致答案偏大
【正确的思路】

(来自于Clove_unique)

我们额外再开一个数组P,用来记录某次更新时,如果某个节点左右两个区间都要更新的话,P数组把重复的情况记下来,最后求query的时候减掉P[该节点];

P.S.:P数组更新有很多种情况,最好可以在草稿纸上模拟一棵线段树,手动算一下

接下来的,就见代码吧

#include<iostream>
#include<cstdio>
#include<algorithm>
#define M (int)5e4
using namespace std;
inline int read(){
char chr = getchar(); int f = 1,ans = 0;
while(!isdigit(chr)) {if(chr == '-') f = -1;chr = getchar();}
while(isdigit(chr)) {ans = (ans << 3) + (ans << 1);ans += chr - '0';chr = getchar();}
return ans* f ;
}
void write(int x){
if(x < 0) putchar('-'),x = -x;
if(x > 9) write(x / 10);
putchar(x % 10 + '0');
}
struct node{
int sum,lazy;
}t[M<<2];
int p[M<<2];
void push_up(int i){
t[i].sum=t[i<<1].sum+t[i<<1|1].sum-p[i];
}
void push_down(int i){
if(t[i].lazy==0) return;
p[i<<1]+=t[i].lazy;//普通的打lazy_tag就不说了,这里但是P数组不能忘记加上去
p[i<<1|1]+=t[i].lazy;
t[i<<1].sum+=t[i].lazy;
t[i<<1].lazy+=t[i].lazy;
t[i<<1|1].sum+=t[i].lazy;
t[i<<1|1].lazy+=t[i].lazy;
t[i].lazy=0;
}
int query(int i,int ql,int qr,int l,int r){
if(ql<=l&&r<=qr) return t[i].sum;
int m=l+r>>1;
push_down(i) ;//下传
int a=0,b=0;
bool ba=0,bb=0;//记录左右儿子有没有更新过
if(m>=ql) ba=1,a=query(i<<1,ql,qr,l,m);
if(m<qr) bb=1,b=query(i<<1|1,ql,qr,m+1,r);
push_up(i);//上传
if(ba&&bb)
return a+b-p[i];//如果左右两个节点都更新过了,那么要减掉P的值
return a+b;
}
void updata(int i,int ql,int qr,int l,int r,int v){
if(ql<=l&&r<=qr){
t[i].sum+=v;
t[i].lazy+=v;
p[i]+=v;//戳重点
return;
}
push_down(i);
int m=l+r>>1;
bool ba=0,bb=0;
if(ql<=m) ba=1,updata(i<<1,ql,qr,l,m,v);
if(qr>m) bb=1,updata(i<<1|1,ql,qr,m+1,r,v);
if(ba&&bb) p[i]+=v;//更新时,左右儿子都更新过的话,P也要更新
push_up(i);
}
int n,m,x,y;
int main(){
n=read(),m=read();
for(int i=1;i<=m;i++){
int opt=read(),x=read(),y=read();
if(opt==1)
updata(1,x,y,1,M,1);
else
write(query(1,x,y,1,M)),puts("");
}
return 0;
}

【LOJ#10115,tyvj1473】校门外的树(第3次升级)的更多相关文章

  1. [TYVJ1473]校门外的树3

    思路: 维护两个树状数组,一个记录种树区间左端点,一个记录右端点. 每次询问查询“看不见的树区间”,即右端点小于查询区间左端点和左端点小于查询区间右端点. #include<cstdio> ...

  2. P1047 校门外的树

    P1047 校门外的树 题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0 ...

  3. Vijos1448校门外的树 题解

    Vijos1448校门外的树 题解 描述: 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的…… 如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现 ...

  4. OpenJudge计算概论-校门外的树

    /*======================================================================== 校门外的树 总时间限制: 1000ms 内存限制: ...

  5. [swustoj 764] 校门外的树 Plus Plus

    校门外的树 Plus Plus(0764) 问题描述 西南某科技大学的校门外长度为 L 的公路上有一排树,每两棵相邻的树之间的间隔都是 1 米.我们可以把马路看成一个数轴,马路的一端在数轴 1 的位置 ...

  6. 校门外的树 - Grids2808

    校门外的树 问题描述: 某校大门外长度为 L 的马路上有一排树,每两棵相邻的树之间的间隔都是1 米.我们 可以把马路看成一个数轴,马路的一端在数轴0 的位置,另一端在L 的位置:数轴上的每 个整数点, ...

  7. 校门外的树 OpenJudge 1.6.06

    06:校门外的树 总时间限制:  1000ms 内存限制:  65536kB 描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0 ...

  8. 【解题报告】VijosP1448校门外的树(困难版)

    原题: 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的--如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作:K=1,K=1,读入l.r ...

  9. Vijos P1103 校门外的树【线段树,模拟】

    校门外的树 描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……, ...

  10. Vijos P1448 校门外的树【多解,线段树,树状数组,括号序列法+暴力优化】

    校门外的树 描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的…… 如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作: K=1,K= ...

随机推荐

  1. 【centOS7】Jenkins安装--漫漫踩坑路

    安装步骤: https://www.cnblogs.com/h--d/p/5673085.html 安装后遇到的问题及解决办法: jenkins的admin用户的初始密码路径 https://blog ...

  2. vsftpd:500OOPS:vsftpd:refusingtorunwithwritablerootinsidechroot()错误的解决方法

    当我们限定了用户不能跳出其主目录之后,使用该用户登录FTP时往往会遇到这个错误: 500 OOPS: vsftpd: refusing to run with writable root inside ...

  3. Appium 教您完美win10安装Appium1.7.2支持win客户端自动化

    参考内容: https://testerhome.com/topics/10193https://testerhome.com/topics/8223https://testerhome.com/to ...

  4. python合并多个txt文件成为一个文件

    #coding=utf-8 import os import os.path #文件夹遍历函数 #获取目标文件夹的路径 filedir = './data/click_data' #获取当前文件夹中的 ...

  5. nexus3的安装和使用

    参考:https://www.cnblogs.com/2YSP/p/9533506.html http://www.54tianzhisheng.cn/2017/10/14/Nexus3-Maven/ ...

  6. Linux下的find命令

    Linux下find命令在目录结构中搜索文件,并执行指定的操作.Linux下find命令提供了相当多的查找条件,功能很强大.即使系统中含有网络文件系统,find命令在该文件系统中同样有效.在运行一个非 ...

  7. LVM(Logical Volume Manager)逻辑卷管理

    本文实验部分,完全由本人亲自动手实践得来 文章中有部分的内容是我个人通过实验测试出来的,虽以目前本人的能力还没发现不通之处,但错误难免,所以若各位朋友发现什么错误,或有疑惑.更好的建议等,盼请各位能在 ...

  8. 从CSV文件中读取jpg图片的URL地址并多线程批量下载

    很多时候,我们的网站上传图片时并没有根据内容进行文件夹分类,甚至会直接存储到阿里云的OSS或是七牛云等云存储上.这样,当我们需要打包图片时,就需要从数据库找寻分类图片,通过CURL进行下载.我最近刚刚 ...

  9. 一个电商项目的Web服务化改造

    一个电商项目的Web服务化改造 项目,早期是随便瞎做的,没啥架构,连基本的设计也没. 有需求,实现需求,再反复修改. 大致就是这么做的. 最近,项目要重新架构,和某boss协商的结果是,采用阿里开源的 ...

  10. oi的小转折

    2018.6.4,衡水中学oier——Yu-shi,真正的走入了外网领域. 从最开始的连scanf都不打取地址,到现在懂了好多以前不敢去看的东西,心态逐渐的成长了.也许有过特别迷茫的时候,也许将来会有 ...