题解 P1276 校门外的树(增强版)
前言
本蒟蒻重学线段树,发现了这道题可以用线段树做。
虽然数据范围很小可以直接暴力,但由于在练习线段树所以打算用线段树写这道题。
本题解针对已经有线段树基础的巨佬,不懂线段树原理的话可以学习线段树后再阅读本题解。
审题
刚看题的时候以为大概是个线段树模板,结果发现事情并不简单。
题目要求的不是剩下多少棵树和砍掉了多少棵树木,而是要求剩下和砍掉了多少棵树苗。
并且需要注意区间是从0开始的。
那么注意到这些差不多就可以开始想做法了。
解决
因为种树人每次种树种植的都是树苗,所以只有最初的区间上会有一整个区间的树木。所以我们可以对于树木建立一棵线段树,再对于树木和树苗共同建立一棵线段树。这样在砍树的时候分别查询两棵线段树并且进行差分,就可以得到区间上砍掉的树苗的数量。最后查询整个区间上树苗个数同理
其中线段树需要支持的操作
- 区间赋值
- 区间加查询
Code
那么具体实现代码如下:
#include<bits/stdc++.h>
using namespace std;
#define file(a) freopen(#a".in","r",stdin),freopen(#a".out","w",stdout)
#define LL long long
#define N 10010
int n,m;
struct node_tree
{
int l,r,mid;
int vol,d;//vol是赋值的lazy标记
};
struct tree//为了方便维护两棵线段树,于是开了结构体
{
node_tree t[N*4];
void build(int i,int l,int r)//建树,本质上是初始化
{
t[i].l=l;t[i].r=r;t[i].mid=(l+r)>>1;
t[i].d=0;t[i].vol=-1;
if(l==r)
{
t[i].d=0;;
return;
}
build(i<<1,l,t[i].mid);
build(i<<1|1,t[i].mid+1,r);
t[i].d=(t[i<<1].d+t[i<<1|1].d);
return;
}
void pushdown(int i)
{
if(!(~t[i].vol)) return;
//这里是防止赋值上初始化值,因为(~(-1))==0
t[i<<1].vol=t[i].vol;
t[i<<1|1].vol=t[i].vol;
t[i<<1].d=t[i].vol*(t[i<<1].r-t[i<<1].l+1);
t[i<<1|1].d=t[i].vol*(t[i<<1|1].r-t[i<<1|1].l+1);
t[i].vol=-1;
return;
}
void modify_vol(int i,int l,int r,int k)//区间赋值
{
if(l<=t[i].l&&t[i].r<=r)
{
t[i].d=k*(t[i].r-t[i].l+1);
t[i].vol=k;
return;
}
pushdown(i);
if(l<=t[i].mid) modify_vol(i<<1,l,r,k);
if(t[i].mid+1<=r) modify_vol(i<<1|1,l,r,k);
t[i].d=(t[i<<1].d+t[i<<1|1].d);
return;
}
int query(int i,int l,int r)//查询区间和
{
if(l<=t[i].l&&t[i].r<=r)
{
return t[i].d;
}
pushdown(i);
int res=0;
if(l<=t[i].mid) res+=query(i<<1,l,r);
if(t[i].mid+1<=r) res+=query(i<<1|1,l,r);
return res;
}
}t1,t2;//t1存树木 t2存树苗加树木
int ans1,ans2;
int main()
{
scanf("%d%d",&n,&m);
t1.build(1,0,n);t2.build(1,0,n);
t1.modify_vol(1,0,n,1);t2.modify_vol(1,0,n,1);//初始化
while(m--)
{
int opt,l,r;
scanf("%d%d%d",&opt,&l,&r);
if(!opt)
{
ans2+=t2.query(1,l,r)-t1.query(1,l,r);
t1.modify_vol(1,l,r,0);
t2.modify_vol(1,l,r,0);
}
if(opt)
{
t2.modify_vol(1,l,r,1);
}
/*
这个是线段树调试(可以忽略)
for(int i=0;i<=n;++i)
{
printf("%d(%d)[%d] ",t2.query(1,i,i),t1.query(1,i,i),i);
}
putchar('\n');
*/
}
ans1=t2.query(1,0,n)-t1.query(1,0,n);
printf("%d\n%d",ans1,ans2);
return 0;
}
题解 P1276 校门外的树(增强版)的更多相关文章
- 洛谷——P1276 校门外的树(增强版)
P1276 校门外的树(增强版) 题目描述 校门外马路上本来从编号0到L,每一编号的位置都有1棵树.有砍树者每次从编号A到B处连续砍掉每1棵树,就连树苗也不放过(记 0 A B ,含A和B):幸运的是 ...
- Luogu P1276 校门外的树(增强版)
Luogu P1276 校门外的树(增强版) 本来看着是道普及-,就不打算写博客了,结果因为出了3次错,调试了15min就还是决定写一下-- 本题坑点: 1.每个位置有三种情况:空穴,树苗,树(而不只 ...
- 洛谷 P1276 校门外的树(增强版)
题目描述 校门外马路上本来从编号0到L,每一编号的位置都有1棵树.有砍树者每次从编号A到B处连续砍掉每1棵树,就连树苗也不放过(记 0 A B ,含A和B):幸运的是还有植树者每次从编号C到D 中凡是 ...
- 洛谷P1276 校门外的树(增强版)未完工
题目描述 校门外马路上本来从编号0到L,每一编号的位置都有1棵树.有砍树者每次从编号A到B处连续砍掉每1棵树,就连树苗也不放过(记 0 A B ,含A和B):幸运的是还有植树者每次从编号C到D 中凡是 ...
- 洛谷题解P1047 校门外的树
题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,…,L,都种有 ...
- Vijos1448校门外的树 题解
Vijos1448校门外的树 题解 描述: 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的…… 如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现 ...
- >题解< 校门外的树
题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是 11 米.我们可以把马路看成一个数轴,马路的一端在数轴 00 的位置,另一端在 LL 的位置:数轴上的每个整数点,即 0,1 ...
- 【解题报告】VijosP1448校门外的树(困难版)
原题: 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的--如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作:K=1,K=1,读入l.r ...
- JDOJ 2197: 校门外的树
JDOJ 2197: 校门外的树 题目传送门 Description 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米. 我们可以把马路看成一个数轴,马路的一端在数轴1的位置,另一 ...
随机推荐
- D2Admin 8月更新: 高级数据持久化|标签页右键|模块化等
剧透:这次,D2Admin 带来了其它同类模板都没有的"花式"数据持久化功能,以及极少同类产品才有的标签页右键控制... 概述 D2Admin 7月份更新到了 1.1.5 版本 相 ...
- 从八道面试题看JavaScript DOM事件机制
As we all know,事件机制其实很简单,无非冒泡和捕获这两点,笔者不再赘述,网上相关文章一大堆,下面让我们直接看面试题 题目一到七,统一设置css .test2 { height: 50px ...
- C#编写一个计算器
编写一个计算器,练习在窗体上添加控件.调整控件的布局,设置或修改控件属性,编写事件处理程序的方法. 代码: using System; using System.Collections.Generic ...
- ajax遍历list数据解决方法
在使用ajax遍历后台传来的list的时,总是遍历不出来,明明在控制台可以打印出来,但就是遍历不出来 之后发现是忘了加一个 dataType: "json" 导致遍历不出来
- 【weex开发】环境配置流程
1,安装node.js node官网下载,然后安装即可. 安装完成以后可以查看node和npm版本 $ node -v v6.11.3 $ npm -v 3.10.10 2,安装weex-toolki ...
- Mysql中如何开启慢查询功能?
1.修改mysql的配置文件my.ini,增加如下信息,修改之后需要重启mysql服务器. 2.执行一句sql查询语句,结果如下. mysql> select count(*) from ecs ...
- 初识react中高阶组件
高阶组件并不是一个组件,而是一个函数 这个函数返回值是一个组件,并且接受一个组件做为参数:并且返回一个新组件: function HighOC(WrapComponent){ //定义一个高阶组件 , ...
- zabbix 6.0 docker-compose 部署
zabbix 6.0 docker-compose 部署 zabbix6.0 已是新LTS版本.根据zabbix-docker上的trunk版本来搭建zabbix6.0. 根据踩坑,记录docker- ...
- js常用框架原理
(function(){ //存储已经创建的模块 var moduleMap = {}; //判断是否已经加载过 var fileMap = {}; ...
- QGIS 3.14插件开发——Win10系统PyCharm开发环境搭建四步走
前言:最近实习要求做一个QGIS插件,网上关于QGIS 3.14插件开发环境搭建的文档不多,而且也不算太全面.正好实习的时候写了一个文档,在这里给大家分享一下. 因为是Word转的Markdown,可 ...