NC16649 [NOIP2005]校门外的树

题目

题目描述

某校大门外长度为 \(L\) 的马路上有一排树,每两棵相邻的树之间的间隔都是 \(1\) 米。我们可以把马路看成一个数轴,马路的一端在数轴 \(0\) 的位置,另一端在 \(L\) 的位置;数轴上的每个整数点,即 \(0,1,2,\cdots,L\)都种有一棵树。

由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。

输入描述

第一行有两个整数:\(L\)(\(1 \leq L \leq 10000\))和 \(M\)(\(1 \leq M \leq 100\)),\(L\) 代表马路的长度,\(M\) 代表区域的数目,\(L\) 和 \(M\) 之间用一个空格隔开。接下来的 \(M\) 行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。

输出描述

包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。

示例1

输入

500 3
150 300
100 200
470 471

输出

298

题解

数据范围一(原题范围):$L \leq 10^4 $ ,$ M \leq 10^2$

思路

知识点:差分。

数组直接模拟整个区间,进行差分。

时间复杂度 \(O(L+M)\)

空间复杂度 \(O(L)\)

代码

#include <bits/stdc++.h>

using namespace std;

int vis[10007];///模拟整个区间

int main(){
int L,M;
cin>>L>>M;
for(int i = 0;i<M;i++){
int l,r;
cin>>l>>r;
vis[l]++;
vis[r+1]--;///差分
}
int a = 0,ans = 0;
for(int i = 0;i<=L;i++){
a += vis[i];///前缀和
if(!a) ans++;///加完之后是0,那说明此处无遮盖
}
cout<<ans<<'\n';
return 0;
}

数据范围二(加强): \(L \leq 10^5\) , \(M \leq 10^5\)

思路

知识点:离散化。

端点代替区间,合并区间后求长与总长相减。

时间复杂度 \(O(MlogM)\)

空间复杂度 \(O(M)\)

代码

#include <bits/stdc++.h>

using namespace std;

struct qj{
int l,r;
}a[100007]; bool cmp(qj a,qj b){
return a.l == b.l?a.r<b.r:a.l<b.l;
} int main(){
int L,M;
cin>>L>>M;
for(int i = 0;i<M;i++){
cin>>a[i].l>>a[i].r;
}
sort(a,a+M,cmp);///按左端点从小到大,再按右端点从小到大 int cnt = 0;///记录合并区间长度
int l = a[0].l,r = a[0].r;///记录初始合并区间
for(int i = 1;i<M;i++){
if(a[i].l<=r) r = max(r,a[i].r);
///当前区间左端点小于等于此合并区间的右端点(不是上个区间的右端点,这里错了tmd)(因为排序,当前区间左端点不可能小于上一个区间左端点)
///那么合并区间的右端点为自己和当前区间右端点的最大值
else{
cnt+=r-l+1;
l = a[i].l;
r = a[i].r;
}///合并结束更新
}
cnt+=r-l+1;
cout<<L-cnt+1<<'\n';///L+1是总端点数 }

数据范围三(再加强): \(L \leq 10^9\) , \(M \leq 10^5\)

思路

知识点:离散化+差分。

已经无法用数组模拟区间,考虑模拟端点的差分值,累加目标区间长度。

时间复杂度 \(O(MlogM)\)

空间复杂度 \(O(M)\)

代码

#include <bits/stdc++.h>

using namespace std;

struct diff{
int pos;
int num;
}delta[100007];///记录特定端点代替整个区间,达到满足空间要求 bool cmp(diff a,diff b){
return a.pos==b.pos?a.num<b.num:a.pos<b.pos;
} int main(){
std::ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int L,M;
cin>>L>>M;
for(int i = 0;i<M;i++){
int x,y;
cin>>x>>y;
delta[i].pos = x;///记录左端点
delta[i].num = 1; delta[i+M].pos = y+1;///记录右端点,因为差分所以y+1
delta[i+M].num = -1;
}
sort(delta,delta+2*M,cmp);///根据左端点从小到大排序,先负再正
int a = 0,cnt = 0;
for(int i = 0;i<2*M;i++){
a += delta[i].num;
if(a == 1 && delta[i].num == 1){///此时pos是0区域的右端点+1位置,上一个pos即左端点位置
cnt+=delta[i].pos - delta[i-1].pos;///相减即为区间长度
}
}
if(!a) cnt+=L-delta[2*M-1].pos+1;
cout<<cnt<<'\n';
return 0; }

NC16649 [NOIP2005]校门外的树的更多相关文章

  1. P1047 校门外的树

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

  2. Vijos P1103 校门外的树【线段树,模拟】

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

  3. C语言 · 校门外的树

    算法提高 校门外的树   时间限制:1.0s   内存限制:256.0MB      问题描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的 ...

  4. >题解< 校门外的树

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

  5. 洛谷P1047 校门外的树

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

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

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

  7. luogu P1047 校门外的树 x

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

  8. Vijos1448校门外的树 题解

    Vijos1448校门外的树 题解 描述: 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的…… 如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现 ...

  9. OpenJudge计算概论-校门外的树

    /*======================================================================== 校门外的树 总时间限制: 1000ms 内存限制: ...

随机推荐

  1. IO——字节缓冲流

    缓冲流:BufferedInputStream / BufferedOutputStream 提高IO效率,减少访问磁盘的次数 数据存储在缓冲区,调用flush将缓存区的内容写入文件中,也可以直接cl ...

  2. Android Studio 的蓝牙串口通信(附Demo源码下载)

    根据相关代码制作了一个开源依赖包,将以下所有的代码进行打包,直接调用即可完成所有的操作.详细说明地址如下,如果觉得有用可以GIthub点个Star支持一下: 项目官网 Kotlin版本说明文档 Jav ...

  3. 通知:PostgreSQL证书申报退税请抓紧!

    2021年个税申报已于3月开始为了确保PostgreSQL证书能顺利退税中心特调研了学员中仅针对证书一项做退税申请没几天就得到结果2021年取得的PostgreSQL职业 技术证书确定可以退税!   ...

  4. 执行Hive sql 报FAILED:Execution Error,return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask

    在hive Beeline命令行使用insert into ... select ...向hive表插入数据时,报FAILED:Execution Error,return code 2 from o ...

  5. ShardingSphere 集成 CosId 实战

    背景 在软件系统演进过程中,随着业务规模的增长 (TPS/存储容量),我们需要通过集群化部署来分摊计算.存储压力. 应用服务的无状态设计使其具备了伸缩性.在使用 Kubernetes 部署时我们只需要 ...

  6. SQL连接查询优化[姊妹篇.第五弹]

    上篇的sql优化篇章,更多偏向于优化的思想概念,先前抛出的4个优化问题中,篇幅过长,只对前两个问题进行了解析. 接下来我们一起来谈谈sql的连接查询优化,更偏向于实际运用,并对如下两个问题进行探讨.篇 ...

  7. Typora 开始收费,改用好玩的MarkText

    收费-- 可以考虑使用:MarkText 简述MarkText MarkText 这个工具侧重于"命令",导航栏都被收起来了.有些小伙伴感觉反而不好用,其实不然,是未了解该工具的强 ...

  8. (原创)[C#] MEF 主程序与插件加载不同版本的DLL

    一.前言 MEF(Managed Extensibility Framework),是轻量级的插件框架.使用简单,功能强大.详细介绍见MSDN,本文不再赘述. 在使用MEF时,会遇到这样一种场景: 主 ...

  9. 性能测试:tcpcopy

    简介 TCPCopy是一种请求复制(所有基于tcp的packets)工具,可以把在线流量导入到测试系统中去. 曾经应用于网易的广告投放系统,urs系统,nginx hmux协议等系统,避免了上线带来的 ...

  10. 【NodeJS】替换模糊查询字符里包含的正则关键字

    问题:正则匹配时字符串中包含了一些特殊字符,导致查询失败 例如,下面的字符包含了( 和 ),这在正则中属于特殊字符 (-)-magnocurarine 正则中的特殊字符如下图 思路: 1.映射查询字符 ...