题解 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的位置,另一 ...
随机推荐
- 深入HTTP协议
一.HTTP定义 超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器. HTTP是一个属于应用层的面向对象协议,由于其简捷.快速的方式, ...
- C#编写程序,用 while 循环语句实现下列功能
编写程序,用 while 循环语句实现下列功能:有一篮鸡蛋,不止一个,有人两个两个数,多余一个,三个三个数,多余一个,再四个四个地数,也多余一个,请问这篮鸡蛋至少有多少个. 代码: using Sys ...
- 微信小程序和公众号和H5之间相互跳转
参考链接:https://www.imooc.com/article/22900 一.小程序和公众号 答案是:可以相互关联. 在微信公众号里可以添加小程序. 可关联已有的小程序或快速创建小程序.已关联 ...
- 适配手机端rpx像素
<script src="static/js/adaptive.js"></script> <script type="text/javas ...
- 圆桌killer
[问题描述] 圆桌上围坐着2n个人.其中n个人是好人,另外n个人是坏人.如果从第m(m<=2n)个人开始数数,数到第k个人,则立即处死该人:然后从被处死的人之后重新开始数数,再将数到的第k个人处 ...
- 使用Socket实现HttpServer(一)
使用Socket实现HttpServer(一) Socket 编程 socket 翻译过来叫插槽,一张图你就明白 socket 就插在 TCP 也就是传输层上,对用户的请求和服务器的响应进行处理. 下 ...
- 【论文阅读】ICLR 2022: Scene Transformer: A unified architecture for predicting future trajectories of multiple agents
ICLR 2022: Scene Transformer: A unified architecture for predicting future trajectories of multiple ...
- Java当中的HashSet
package collection; import java.util.HashSet; import java.util.Iterator; import java.util.Set; /* * ...
- js中的undefined
undefined,一个特殊值,通常用于指示变量尚未赋值,是一个JavaScript的 原始数据类型 . 如果后台返回前台数据为空(无数据),那么用该对象获取其中的属性会显示undefined. 如果 ...
- zabbix监控SSL证书有效期
想给公司网站加上证书的监控,发现agent无此监控项.科普之后发现需要自行添加脚本以及一些操作. 环境信息 系统版本: Ubuntu20.04 zabbix server版本:5.4 (这个自定义貌似 ...