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包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。

输入输出样例

输入样例#1:

500 3
150 300
100 200
470 471
输出样例#1:

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的更多相关文章

  1. luogu P1047 校门外的树

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

  2. P1047 校门外的树

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

  3. 洛谷P1047 校门外的树

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

  4. 洛谷——P1047 校门外的树

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

  5. Luogu P1276 校门外的树(增强版)

    Luogu P1276 校门外的树(增强版) 本来看着是道普及-,就不打算写博客了,结果因为出了3次错,调试了15min就还是决定写一下-- 本题坑点: 1.每个位置有三种情况:空穴,树苗,树(而不只 ...

  6. 【洛谷】【线段树】P1047 校门外的树

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

  7. [模拟]P1047 校门外的树

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

  8. 洛谷 P1047 校门外的树(待完善)

    链接:https://www.luogu.org/problemnew/show/P1047 题目: 题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是11米.我们可以把马路看 ...

  9. 洛谷题解P1047 校门外的树

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

随机推荐

  1. Linux操作系统(六)_文件系统结构

    linux只有一个文件树,整个文件系统是以一个树根"/"为起点的 所有的文件和外部设备都以文件的形式挂在上面,linux发行版本的根目录大都是以下结构: /bin /sbin /b ...

  2. java如何台生成二维码详解

    现在呢说明页面上展示二维码的两种方式: 1.使用img标签的src来请求生成二维码,后台会直接返回: 2.此处跟上方意思相似,获取到url给img标签设置src属性: 特别注意:如果url有amp;, ...

  3. 事件 on emit off 封装

    /* on 绑定 emit 触发 off 解绑 //存放事件 eventList = { key:val handle:[] } 1对多 on(eventName,callback); handle: ...

  4. 前端项目中使用jsencrypt进行字段加密

    前端项目中使用jsencrypt进行字段加密. 使用步骤:①获取公钥②实例化对象③设置公钥④将所需数据进行加密然后返回. 进行一个简单的封装如下 /** * npm install jsencrypt ...

  5. hackinglab 基础关 writeup

    地址:http://hackinglab.cn/ 基础关 key在哪里? 很简单,点击过关地址,在新打开的网页中查看网页源代码就能在 HTML 注释中发现 key 再加密一次你就得到key啦~ 明文加 ...

  6. Struts2的核心配置文件

    Struts2的详细配置: 配置的是struts2的核心配置文件:,在struts2的核心配置文件中主要有三个标签需要进行配置:package,action,result. 1. 配置package标 ...

  7. jJava第一周学习总结

    对于本学期要学习的Java程序语言,经过一周多的学习,我们首先在第一堂课了解了Java平台以及Java的历史,接着认识了JDK,初步了解了JDK的安装,JDK运行环境的设置,包括其中路径path的设置 ...

  8. [Git] 004 初识 Git 与 GitHub 之查看历史记录

    在 GitHub 的 UI 界面使用 Git 查看历史纪录 1. 右侧有个 history 2. 点击后跳转页面 3. 点击相应标题(commit 时写的),进入相应版本(历史) 4. 我选择了 I ...

  9. [19/05/17-星期五] HTML_body标签(内嵌标签)和框架标签

    一.内嵌标签 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <!- ...

  10. 小白学Python(13)——pyecharts 绘制 柱状图/条形图 Bar

    Bar-基本示例 from example.commons import Faker from pyecharts import options as opts from pyecharts.char ...