题目描述
某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。
马路上有一些区域要用来建地铁,这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。
你的任务是计算将这些树都移走后,马路上还有多少棵树。
输入
输入的第一行有两个整数L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点 和终止点的坐标。
输出
输出包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。
样例输入
500 3150 300100 200470 471
样例输出
298
线段的区间覆盖,我把这道题当作自己线段树的入门题。线段树的核心思想是以空间换时间。以4倍的空间复杂度来将O(n)的算法优化成O(logn)。
如果现在的节点在树的数组中的下标为now,则它的左儿子的下标就是now*2,右儿子的下标就是now*2+1。
如果现在节点所代表的区间范围是[l,r],则它的左儿子代表的区间范围是[l,mid],右儿子是[mid+1,r](mid=(l+r)/2);
建树的时候按照先序遍历的顺序来建树。
代码如下:
 #include <bits/stdc++.h>

 using namespace std;
#define MAXN 40040
#define inf 0x3f3f3f3f
struct segTree
{
int l,r,sum;
}tree[MAXN];
void buildTree (int now,int ll,int rr)
{
tree[now].l=ll;
tree[now].r=rr;
if (ll==rr)//如果当前区间长度为1
{
tree[now].sum=;//这个区间最开始只有1棵树
return;//不写return会炸...
}
int mid=(ll+rr)/;
int lch=now*,rch=now*+;
buildTree(lch,ll,mid);//建左子树
buildTree(rch,mid+,rr);//建右子树
tree[now].sum=tree[lch].sum+tree[rch].sum;
//父亲节点树木是左右子节点的树木个数的和
}
void update (int now,int ll,int rr,int x,int y)
{
if (ll>y||rr<x||tree[now].sum==)
//当[x,y]与当前区间[ll,rr]没有交集时,或此区间的树都已经被拔光了
return ;
if (x<=ll&&y>=rr)
{
tree[now].sum=;//将此区间树拔光
return ;
}
int mid=(ll+rr)/;
int lch=now*,rch=now*+;
update(lch,ll,mid,x,y);//二分寻找[ll,rr],使其与[x,y]有交集
update(rch,mid+,rr,x,y);
tree[now].sum=tree[lch].sum+tree[rch].sum;
}
int L,M;
int main()
{
//freopen("de.txt","r",stdin);
scanf("%d%d",&L,&M);
buildTree(,,+L);
for (int i=;i<M;++i)
{
int left,right;
scanf("%d%d",&left,&right);
update(,,+L,left+,right+);
}
printf("%d\n",tree[].sum);
return ;
}

POJ 2808 校门外的树(线段树入门)的更多相关文章

  1. [bzoj3226][Sdoi2008]校门外的区间——线段树

    题目 略 题解 直接套黄学长模板. Orz 代码 #include <bits/stdc++.h> using namespace std; #define ll long long #d ...

  2. [SDOI2008] 校门外的区间 - 线段树

    U T 即将区间 \(T\) 范围赋值为 \(1\) I T 即将区间 \(U - T\) 范围赋值为 \(0\) D T 即将区间 \(T\) 赋值为 \(0\) C T 由于 \(S=T-S=T( ...

  3. POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)

    POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ...

  4. 【POJ 2777】 Count Color(线段树区间更新与查询)

    [POJ 2777] Count Color(线段树区间更新与查询) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4094 ...

  5. 【POJ 2750】 Potted Flower(线段树套dp)

    [POJ 2750] Potted Flower(线段树套dp) Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4566   ...

  6. 浅谈树套树(线段树套平衡树)&学习笔记

    0XFF 前言 *如果本文有不好的地方,请在下方评论区提出,Qiuly感激不尽! 0X1F 这个东西有啥用? 树套树------线段树套平衡树,可以用于解决待修改区间\(K\)大的问题,当然也可以用 ...

  7. Bailian 2808 校门外的树(入门线段树)

    题目链接:http://bailian.openjudge.cn/practice/2808?lang=en_US 总时间限制: 1000ms 内存限制: 65536kB 描述 某校大门外长度为L的马 ...

  8. poj 2528 Mayor's posters(线段树+离散化)

    /* poj 2528 Mayor's posters 线段树 + 离散化 离散化的理解: 给你一系列的正整数, 例如 1, 4 , 100, 1000000000, 如果利用线段树求解的话,很明显 ...

  9. poj 2155:Matrix(二维线段树,矩阵取反,好题)

    Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 17880   Accepted: 6709 Descripti ...

随机推荐

  1. mybatis源码分析之03SqlSession的创建

    在上一篇中,说到了mybatis是如何构造一个SqlSessionFactory实例的,顾名思意,SqlSessionFactory就是用于创建SqlSession的工厂类. 好,现在我们接着昨天的来 ...

  2. PCB六层板学习(一)

    一.原理图的网表导出及版本转换 安装Cadence后,打开RK3288的原理图. 首先点击rk3288-mid.dsn >> 然后有一个Create netlist的图标(当然咋Tools ...

  3. 关于12306Bypass-分流抢票

    12306Bypass-分流抢票-2013-15年          官网:http://www.12306bypass.com 分流抢票是一款完全免费的抢票软件,请抵制淘宝贩卖等诈骗行为 作者不会授 ...

  4. 安卓Activity布局简述

    Activity布局简述 基于xml的布局 Main.xml(调用工程res/layout/main.xml定义的界面元素完成布局显示) <?xml version="1.0" ...

  5. ubuntu下node.js 环境搭建

    由于使用gulp.js来对前端项目进行管理,所以搭建了node.js的环境 首先, 需要安装node, npm 去官网下载安装包,解压后放到你的安装的目录.在这里我的是/opt/node-v6.11. ...

  6. PHP将mysql数据表转换为excel文件

    测试代码: <?php $DB_Server = "127.0.0.1"; $DB_Username = "root"; $DB_Password = & ...

  7. 如何保存android app日志

    android 手机日志保存方法如下: 前置条件:已安装adb 1,手机usb连接电脑,打开USB调试模式(注意仅连接一台手机设备) 2,win+R输入cmd打开命令窗口,输入指令:adb devic ...

  8. Java集合的介绍

    参考博客: https://blog.csdn.net/zhangqunshuai/article/details/80660974 List , Set, Map都是接口,前两个继承至Collect ...

  9. 使用 nm-applet 连接 WPA2-Enterprise wireless

    安装之后,使用 nm-connetion-editor 编辑连接信息: 之使 systemctl retart NetworkManager: 之后使用 nmcli conn up $CONNECT_ ...

  10. <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no">

    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalabl ...