题解 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 版本 相 ...
- 如何使用Flannel搭建跨主机互联的容器网络
当您将多台服务器节点组成一个Docker集群时,需要对集群网络进行设置,否则默认情况下,无法跨主机容器互联,接下来我们首先分析一下原因. 跨主机容器互联 下图描述了一个简单的集群网络,在该集群内,有两 ...
- php弹窗后跳入另一个页面
之前写项目时,在跳转页面前加入一个弹窗,发现弹窗没有弹出来就直接跳转了,之前使用的header跳转发现不行,换成location.href也不行,后来再location.href前加入一个parent ...
- jQuery实现数字时钟
运行效果: 源代码: 1 <!DOCTYPE html> 2 <html lang="zh"> 3 <head> 4 <meta char ...
- 微信小程序插件组件-Taro UI
微信小程序组件使用以下官网查看 ↓ ↓ ↓ https://taro-ui.jd.com/#/docs/fab
- css3,css的基础全局运用
浮动 1.浮动起来的盒子不占用位置,浮动了一个盒子下面的标准流的盒子会顶上来 可用清除浮动的方法来解决标准流会顶替位置的问题 清除浮动给父盒子加overflow: hidden; 鼠标经过事件 : ...
- 在Wireshrak中使用过滤器——捕获过滤器
过滤器可以让你找出你所希望进行分析的数据包.简单来说,一个过滤器就是定义了一定条件,用来包含或者排除数据包的表达式.如果你不希望看到一些数据包,你可以写一恶搞过滤器来屏蔽它们.如果你希望只看到某些数据 ...
- 无法访问 CentOS7服务器上应用监听的端口
无法访问 CentOS7服务器上应用监听的端口 参考资料 云主机上Centos7配置Iptables规则开启80.3306等端口https://blog.csdn.net/qq_37960007/ar ...
- Solon 1.6.36 发布,更现代感的应用开发框架
相对于 Spring Boot 和 Spring Cloud 的项目 启动快 5 - 10 倍 qps 高 2- 3 倍 运行时内存节省 1/3 ~ 1/2 打包可以缩小到 1/2 ~ 1/10(比如 ...
- 用js实现倒计时效果
首先获得两个时间的时间戳 var newdate = new Date('2021-01-22 21:25:00').getTime(); var olddate = new Date().getTi ...