Bailian 2808 校门外的树(入门线段树)
题目链接:http://bailian.openjudge.cn/practice/2808?lang=en_US
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
- 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。
马路上有一些区域要用来建地铁,这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。 - 输入
- 输入的第一行有两个整数L(1 <= L <= 10000)和 M(1 <= M <=
100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。 - 输出
- 输出包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。
- 样例输入
-
500 3
150 300
100 200
470 471 - 样例输出
-
298
- 来源
- noip2005普及组
- 这个题真是非常适合用来入门了,之前也做过线段树的专题,没做笔记,到现在快忘干净了,,,做笔记很重要额。。。
看代码吧,写的还算详细。当然这个题也可以通过标记来实现,耗费的时间差不多。(第一个是用线段树写的,第二个是用标记写的)

线段树代码:
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn = *;
struct Tree
{
int l,r;
int sum;
}tree[maxn]; void build(int rt,int ll,int rr)
{
tree[rt].l = ll;
tree[rt].r = rr;
if(ll == rr) //左右节点相等说明到了叶子节点了
{
tree[rt].sum = ;// 这个节点最开始只有一棵树
return ; //不写return会炸
}
int mid = (ll+rr)/;
build(rt*,ll,mid); //向左建立左子树
build(rt*+,mid+,rr); //向右建立右子树
//父亲节点树的棵数是左右子节点树的棵数的和
tree[rt].sum = tree[rt*].sum + tree[rt*+].sum;
} void update(int rt,int ll,int rr,int x,int y)
{
if(ll>y||rr<x||tree[rt].sum == ) //当[x,y]与当前区间[ll,rr]没有交集时和树的棵树为零时;
return ;
if(x<=ll&&y>=rr)
{
tree[rt].sum = ; //将此区间树拔光
return ;
}
int mid = (ll+rr)/; //别取成要查找区间的中止了,写错了找了好久的bug
update(rt*,ll,mid,x,y); //二分寻找[ll,rr],使其与[x,y]有交集;
update(rt*+,mid+,rr,x,y);
tree[rt].sum = tree[rt*].sum + tree[rt*+].sum;
}
int main()
{
int L,M;
int x,y;
// scanf("%d%d",&L,&M);
cin>>L>>M;
build(,,L+);
for(int i=;i<M;i++)
{
// scanf("%d%d",&x,&y);
cin>>x>>y;
update(,,L+,x+,y+);
}
int ans = tree[].sum;
printf("%d\n",ans);
return ;
}
标记代码:
#include<iostream>
#include<cstdio>
#include <cstring>
using namespace std; const int maxn = ;
int L,M;
int x,y;
int sum;
int maze[maxn]; //将某段区间内的值全部标记为1; int main()
{
while(scanf("%d%d",&L,&M)!=EOF)
{
memset(maze,,sizeof(maze));
sum = ;
for(int i=;i<M;i++)
{
cin>>x>>y;
for(int ii = x;ii<=y;ii++)
{
if(maze[ii]==)
continue;
maze[ii] = ;
}
}
for(int i=;i<=L;i++)
{
if(maze[i] == ) //统计不是0的个数,也就是剩余的树的数目;
sum++;
}
cout<<sum<<endl;
}
return ;
}
Bailian 2808 校门外的树(入门线段树)的更多相关文章
- bzoj 3226 [Sdoi2008]校门外的区间(线段树)
3226: [Sdoi2008]校门外的区间 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 615 Solved: 227[Submit][Stat ...
- 3226. [SDOI2008]校门外的区间【线段树】
Description 受校门外的树这道经典问题的启发,A君根据基本的离散数学的知识,抽象出5种运算维护集合S(S初始为空)并最终输出S.现在,请你完成这道校门外的树之难度增强版——校门外的区间. ...
- LOJ#510. 「LibreOJ NOI Round #1」北校门外的回忆(线段树)
题面 传送门 题解 感谢\(@M\_sea\)的代码我总算看懂题解了-- 这个操作的本质就是每次把\(x\)的\(k\)进制最低位乘\(2\)并进位,根据基本同余芝士如果\(k\)是奇数那么最低位永远 ...
- LOJ 北校门外的回忆 倍增+线段树
正解:倍增+线段树 解题报告: 传送门! $umm$这题有个对正解毫无启发的部分分还有个正解,都挺神仙的所以我都写了趴$QAQ$ 先说部分分 可以考虑把$x$向$x+lowbit(x)$连边,然后当$ ...
- 线段树简单入门 (含普通线段树, zkw线段树, 主席树)
线段树简单入门 递归版线段树 线段树的定义 线段树, 顾名思义, 就是每个节点表示一个区间. 线段树通常维护一些区间的值, 例如区间和. 比如, 上图 \([2, 5]\) 区间的和, 为以下区间的和 ...
- dfs序+主席树 或者 树链剖分+主席树(没写) 或者 线段树套线段树 或者 线段树套splay 或者 线段树套树状数组 bzoj 4448
4448: [Scoi2015]情报传递 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 588 Solved: 308[Submit][Status ...
- UVALive 7148 LRIP【树分治+线段树】
题意就是要求一棵树上的最长不下降序列,同时不下降序列的最小值与最大值不超过D. 做法是树分治+线段树,假设树根是x,y是其当前需要处理的子树,对于子树y,需要处理出两个数组MN,MX,MN[i]表示以 ...
- [BZOJ 1901] Dynamic Rankings 【树状数组套线段树 || 线段树套线段树】
题目链接:BZOJ - 1901 题目分析 树状数组套线段树或线段树套线段树都可以解决这道题. 第一层是区间,第二层是权值. 空间复杂度和时间复杂度均为 O(n log^2 n). 线段树比树状数组麻 ...
- BZOJ_2238_Mst_树剖+线段树
BZOJ_2238_Mst_树剖+线段树 Description 给出一个N个点M条边的无向带权图,以及Q个询问,每次询问在图中删掉一条边后图的最小生成树.(各询问间独立,每次询问不对之后的询问产生影 ...
随机推荐
- C++ 课堂作业1.0
c++第一次课堂作业点这里 题目要求:输入半径,计算圆的面积,在调用外部函数,无需使用类.
- IKVM.NET入门(2)
ikvm.net是什么 http://www.ikvm.net/ ikvm.net是能够运行在mono和.net framework的java虚拟机.它包括了 在.net中实现的一个java虚拟机 j ...
- window7远程桌面到server不能复制粘贴解决的方法
用远程桌面登陆server不能在本机和远程server之间粘贴文本了,即不能从本机复制文本粘贴到server,也不能从server复制文本粘贴到本机. 下面是解决方法之中的一个,试了几次都非常管用户: ...
- 20155314 2016-2017-2 《Java程序设计》实验三 敏捷开发与XP实践
20155314 2016-2017-2 <Java程序设计>实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验知识点总结 (一)敏捷开发与XP 软件工程:把系统 ...
- 用ansible2.5在Centos7.2上部署OpenShift3.9(转)
1.环境: 主机名 ip 角色 master 10.2.1.198 master node1 10.2.1.174 no ...
- 第一章 Linux内核简介
1. 操作系统和内核 操作系统是指在整个系统中负责完成最基本功能和系统管理的那些部分.包括内核.设备驱动程序.启动引导程序.命令行shell或者其他种类的用户界面.基本的文件管理工具和系统工具. 用户 ...
- 填移动端坑系列一——如何让h5页面完美整屏显示
原创哟,转载请附上本文连接(http://www.cnblogs.com/AliceX-J/p/6707908.html),作者 印前 后续更简单 前言: 最近让做一个h5的活动专题,便让我浩浩荡荡进 ...
- snapkit更新约束崩溃的问题
最近在使用snapkit布局时,竟然发现更新约束会导致崩溃,为什么这样呢? checkButton.snp.makeConstraints { (make) in make.left.top.equa ...
- JavaScript中的数据属性和访问器属性
在学习JavaScript原型(prototype)和原型链(prototype chain)知识的时候,发现数据属性和访问器属性的重要性,通过不断的查找相关知识,浅显理解如下,若有差错,希望不吝赐教 ...
- layui水平导航条三级
需求 需要做一个顶部的水平导航条,有三级,展开的时候二级和三级一起展开,结果如图: 效果 一级菜单 二级标题 三级菜单 三级菜单 二级标题 三级菜单 三级菜单 一级菜单 二级标题 三级菜单 ...