luogu P1047 校门外的树 x
P1047 校门外的树
题目描述
某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。
由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。
输入输出格式
输入格式:
输入文件tree.in的第一行有两个整数L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。
输出格式:
输出文件tree.out包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。
输入输出样例
500 3
150 300
100 200
470 471
298
说明
NOIP2005普及组第二题
对于20%的数据,区域之间没有重合的部分;
对于其它的数据,区域之间有重合的情况。
思路:
1)模拟!
数据范围辣么小!!!直接开个布尔数组记录一下是不是被砍了不就行咯?最后从头到尾扫一遍,没被砍就ans++,最后输出ans,完啦~
2)线段树!
其实我是很惊讶的!这么个模拟就能够水过去的题还可以用线段树做,代码虽然也不长,但是比模拟要长上好多QwQ
但是我还是作死的写了.Orz.
代码酱来也~
#include <iostream>
#include <cstdio>
#include <cmath> using namespace std; const int M = 1e4 + ;///范围QwQ
int Ls,m,ans;
bool kan[M];///记录是否被砍掉 int main()
{
scanf("%d%d",&Ls,&m);
int l,r;
for(int i=;i<m;i++)
{
scanf("%d%d",&l,&r);
if(l>r) swap(l,r);///闲得慌hhh
for(int j=l;j<=r;j++)
{
if(!kan[j]) kan[j]=;///砍啦~~~
}
}
for(int i=;i<=Ls;i++)
if(!kan[i]) ans++;
printf("%d",ans);
return ;
}
模拟
#include <iostream>
#include <cstdio>
///方便快捷的写代码~
#define lez k<<1
#define rez k<<1|1
#define mid ((l+r)>>1) using namespace std; const int M = 1e4 + ;
int Ls,Ms;
int lefts,rights; struct Trees{
int l,r;
int now;///当前有多少棵没被砍掉的树
}t[M*];///!!!要开四倍空间 inline void build(int k,int ld,int rd)
{///建树过程
t[k].l=ld,t[k].r=rd;///赋值
if(ld==rd)
{
t[k].now=;///递归到叶子节点
return ;
}
int m = (ld+rd) >> ;///中间节点
build(lez,ld,m);///建左子树
build(rez,m+,rd);///右子树
t[k].now=t[lez].now+t[rez].now;///更新棵数
} inline void change(int l,int r,int k)
{///更新线段树,以及我们更新要建火车站的范围
l=t[k].l,r=t[k].r;
///如果当前递归到的是超出需要修改的范围的(或者该地已经没有树咯),就跳出
if(l>rights || r<lefts || t[k].now == ) return ;
///如果刚好在范围之内
if(lefts<=l && rights>=r)
{
t[k].now=;///进行修改
return ;
}
change(l,mid,lez);///更新左子树
change(mid+,r,rez);///右子树
t[k].now=t[lez].now+t[rez].now;///必须更新棵数!!!
} int main()
{
scanf("%d%d",&Ls,&Ms);
Ls++;///因为题目中的是从0开始的,所以要多加一个
build(,,Ls);
for(int i=;i<=Ms;i++)///类似于Ms次修改询问???
{
scanf("%d%d",&lefts,&rights);///左右端点
lefts++;rights++;
change(,Ls,);
}
printf("%d",t[].now);///最后直接输出第一个根节点的棵树,不就行了咩?
return ;
}
///End.
线段树
End.
luogu P1047 校门外的树 x的更多相关文章
- luogu P1047 校门外的树
题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L,都种 ...
- P1047 校门外的树
P1047 校门外的树 题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0 ...
- 洛谷P1047 校门外的树
P1047 校门外的树 题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0 ...
- 洛谷——P1047 校门外的树
P1047 校门外的树 题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0 ...
- Luogu P1276 校门外的树(增强版)
Luogu P1276 校门外的树(增强版) 本来看着是道普及-,就不打算写博客了,结果因为出了3次错,调试了15min就还是决定写一下-- 本题坑点: 1.每个位置有三种情况:空穴,树苗,树(而不只 ...
- 【洛谷】【线段树】P1047 校门外的树
[题目描述:] 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L ...
- [模拟]P1047 校门外的树
校门外的树 题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,- ...
- 洛谷 P1047 校门外的树(待完善)
链接:https://www.luogu.org/problemnew/show/P1047 题目: 题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是11米.我们可以把马路看 ...
- 洛谷题解P1047 校门外的树
题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,…,L,都种有 ...
随机推荐
- 【EWM系列】SAP 关于EWM的WT增强简介
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP 关于EWM的WT增强简介 ...
- JDK8以后接口是可以定义实现方法,必须需要default修饰符修饰
package com.company.java.oop.cls; interface IB { default void doMethod1() { System.out.println(" ...
- mooc-IDEA 列操作--005
十一.IntelliJ IDEA -列操作 实例:根据HTTP请求JSON文件,生成一个枚举类 Step1:创建一个枚举类,把要转换的JSON串粘贴进来. 最终要实现效果 Step2:选中第一个100 ...
- oracle--事物特性、锁、
update emp set comm = 100 where empno = 7369; 使用dba用户查看事务 ADDR XIDUSN XIDSLOT XIDSQN UBAFIL UBABLK U ...
- C语言I作业12——学习总结
1.我学到的内容 二.我的收获 作业 链接 第一次作业 https://www.cnblogs.com/liuxiangjiang/p/11579877.html 第二次作业 https://www. ...
- JVM-堆内存
1. java堆内存介绍 java的堆内存可以类比于计算机的内存,是存储整个机器数据的地方. (1)jvm一起动就创建java堆.类比计算机一起动就加载内存. (2)所有的线程共享.类比计算机所有进程 ...
- VS2010中解决Qt“Unable to find a Qt build“
转自:http://blog.sina.com.cn/s/blog_687960370101d0eu.html 三种方法: 1.在QT菜单下单击OPTION,然后单击ADD,选择QT安装路径. 2.运 ...
- docker pull使用 代理
[root@fdfs- ~]# cat /usr/lib/systemd/system/docker.service [Unit] Description=Docker Application Con ...
- Angular 组件通讯方式
(一)父子组件 输入/输出属性 关键词 Input,Output,EventEmitter. 父子组件信息信息,分为 (1)子组件向父组件传递 (2)父组件向子组件传递 (二)模版变量与 @V ...
- Python 数据分析中常用的可视化工具
Python 数据分析中常用的可视化工具 1 Matplotlib 用于创建出版质量图表的绘图工具库,目的是为 Python 构建一个 Matlab 式的绘图接口. 1.1 安装 Anaconada ...