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,都种有 ...
随机推荐
- 抓包工具tcpdump用法说明--2
第一招: 通俗的说,tcpdump是一个抓包工具,用于抓取互联网上传输的数据包.形象的说,tcpdump就好比是国家海关,驻扎在出入境的咽喉要道,凡是要入境和出境的集装箱,海关人员总要打开箱子,看看里 ...
- MySQL使用Navicat远程连接时报错1251
1.报错信息 client does not support authentication protocol requested by server:consider upgrading MySQL ...
- 剑指offer--day10
1.1 题目:二叉搜索树的后序遍历序列:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 1.2 思路: 以{ ...
- 为什么说 Babel 将推动 JavaScript 的发展【转】
Babel是一个转换编译器,它能将 ES6 转换成可以在浏览器中运行的代码.Babel 由来自澳大利亚的开发者Sebastian McKenzie创建.他的目标是使 Babel 可以处理 ES6 的所 ...
- MySQL练习与小结
当你专注一件事的时候,时间总是过得很快! foreign key 练习 -- 切换数据库 use stumgr -- 删除班级表 drop table t_class1 -- 创建一个班级表 crea ...
- windows10配置Docker容器独立IP地址互相通信
Docker官方推荐我们通过端口映射的方式把Docker容器的服务提供给宿主机或者局域网其他容器使用.一般过程是: 1.Docker进程通过监听宿主机的某个端口,将该端口的数据包发送给Docker容器 ...
- 不定参数(rest 参数 ...)
不定参数 如何实现不定参数 使用过 underscore.js 的人,肯定都使用过以下几个方法: _.without(array, *values) //返回一个删除所有values值后的array副 ...
- redis关闭和启动
redis关闭 到redis节点目录下执行如下命令 redis-cli -p 端口号 shutdown redis启动 ./redis-server 参数 参数:redis.conf文件全路径 需要到 ...
- SQL语句-exec执行
动态sql语句基本语法1 :普通SQL语句可以用Exec执行 eg: Select * fromtableName Exec('select * from tableName') ...
- 微信支付签名算法JavaScript版,参数名ASCII码从小到大排序;0,A,B,a,b;
// 支付md5加密获取sign paysignjs: function (jsonobj) { var signstr = this.obj2str(jsonobj) signstr = signs ...