【寒假每日一题】AcWing 4455. 出行计划

简介: 目录一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解 三、知识风暴差分与前缀和

一、题目

1、原题链接

4455. 出行计划 - AcWing题库


2、题目描述

最近西西艾弗岛上出入各个场所都要持有一定时限内的核酸检测阴性证明。

具体来时,如果在 t 时刻做了核酸检测,则经过一段时间后可以得到核酸检测阴性证明。

这里我们假定等待核酸检测结果需要 k 个单位时间,即在 t+k 时刻可以获得结果。

如果一个场所要求持 24 个单位时间内核酸检测结果入内,那么凭上述的核酸检测结果,可以在第 t+k 时刻到第 t+k+23 时刻进入该场所。

小 C 按时间顺序列出接下来的 n 项出行计划,其中第 i 项(1≤i≤n)可以概括为:ti 时刻进入某场所,该场所需持有 ci 个单位时间内的核酸检测结果入内,其中 0<ci≤2×10^5。

为了合理安排核酸检测时间,试根据小 C 的出行计划,回答如下查询:

如果在 q 时刻做了核酸检测,有多少项出行计划的核酸检测要求可以得到满足?

这样的查询共有 m 个,分别为 q1,q2,⋯,qm;查询之间互不影响。


输入格式

输入的第一行包含空格分隔的三个正整数 n、m 和 k,分别表示出行计划数目、查询个数以及等待核酸检测结果所需时间。

接下来输入 n 行,其中每行包含用空格分隔的两个正整数 ti、ci,表示一项出行计划;出行计划按时间顺序给出,满足 0<t1≤t2≤⋯≤tn≤2×10^5。

最后输入 m 行,每行仅包含一个正整数 qi,表示一个查询。m 个查询亦按照时间顺序给出,满足 0<q1<q2<⋯<qm≤2×10^5。


输出格式

输出共 m 行,每行一个整数,表示对应查询的答案。


数据范围

40% 的测试数据满足 0<n,k≤1000、m=1;

70% 的测试数据满足 0<n,m,k≤1000;

全部的测试数据满足 0<n,m,k≤10^5。


输入样例:

6 2 10

5 24

10 24

11 24

34 24

35 24

35 48

1

2


输出样例:

3

3


样例解释

时刻 1 做检测,可以满足第三、四、六项出行计划;

时刻 2 做检测,可以满足第四、五、六项出行计划。

二、解题报告

1、思路分析

我的思路

1)按照题意进行模拟,依次计算可以满足条件的答案数。

2)依次输出答案,即为所求。

(TLE,只通过了70%的数据)

思路来源:AcWing 4455. 出行计划(寒假每日一题2023) - AcWing

y总yyds

y总思路

1)开一个数组代表在各个时刻q时,满足的计划数有多少个。

2)从暴力解法思想中用来判断是否是满足核酸检测要求的计划的条件中可以解得q的范围t[i]-c[i]-k+1<=q<=t[i]-k,代表针对每个计划i,在该时间段区间中都可以进入,所以更新对应数组元素的值,代表该时刻满足的核酸检测的计划数+1,直至统计完所有的计划。

3)针对上述过程,对某一给定区间加1,可以利用差分来进行操作。

4)模拟上述过程,输出结果即为所求。


2、时间复杂度

我的思路时间复杂度为O(n^2)

y总思路时间复杂度为O(n)


3、代码详解

我的思路的代码

#include <iostream>

using namespace std;

int t[100010],c[100010],ans[100010];

int main()

{   int n,m,k;

   cin>>n>>m>>k;

   for(int i=0;i<n;i++){

    cin>>t[i]>>c[i];

}

int q;

for(int i=0;i<m;i++){

 cin>>q;

 for(int j=0;j<n;j++){

  if(q+k<=t[j]&&q+k+c[j]-1>=t[j]){

   ans[i]++;

  }

 }

}

for(int i=0;i<m;i++){

 cout<<ans[i]<<endl;

}

   return 0;

}


y总思路的代码

#include <iostream>

using namespace std;

int d[200010];

int ans[10010];

int main()

{   int n,m,k;

   cin>>n>>m>>k;

int t,c;

   for(int i=0;i<n;i++){

    cin>>t>>c;

    int l=t-c-k+1;

    int r=t-k;

    //差分

    //区间右端点大于0才有合法

    if(r>0){

     d[max(1,l)]++;  //在区间右端点合法时,左端点最小为1,因为查询的时刻q大于0,所以当左端点不合法时,也需要保证左端点在有效范围内

     d[r+1]--;

 }

}

int q;

//前缀和

for(int i=1;i<200010;i++){

 d[i]+=d[i-1];

}

for(int i=0;i<m;i++){

 cin>>q;

 cout<<d[q]<<endl;

}

   return 0;

}


三、知识风暴

差分与前缀和

可以参考这篇文章的相关内容

【寒假每日一题】AcWing 4655. 重新排序(补)_万里悲秋常作客,百年多病独登台.的博客-CSDN博客


目录
相关文章
|
关系型数据库 MySQL 数据库
n8n自动化工具部署与使用
n8n是一款开源的工作流自动化工具,类似于IFTTT。它的优点是开源、可以自托管、下载安装方便、易于使用,可以互联上百种服务。n8n基于节点能够将任何工具连接在一起,轻松部署不同类型的任务。它可以做很多事情,比如:从数据库中获取数据后下载为excel然后通过邮件发送给其他人。
9442 1
|
JavaScript 前端开发 API
面试官:ui组件可以自动加载,那么业务组件可以吗?
面试官:ui组件可以自动加载,那么业务组件可以吗?
|
11月前
|
关系型数据库 MySQL 数据库
开发者如何使用数据库文件存储 DBFS
【10月更文挑战第10天】开发者如何使用数据库文件存储 DBFS
333 5
|
Python
Python中的try-except异常处理机制
Python中的try-except异常处理机制
227 0
|
网络安全 图形学 Android开发
Unity与安卓丨AS报错:SSL peer shut down incorrectly
Unity与安卓丨AS报错:SSL peer shut down incorrectly
Unity与安卓丨AS报错:SSL peer shut down incorrectly
|
安全 数据安全/隐私保护 UED
单点登录原理
单点登录原理
285 3
|
Cloud Native 持续交付 云计算
云原生技术在现代企业中的应用与实践
【7月更文挑战第31天】本文将探讨云原生技术如何助力企业实现数字化转型,通过具体案例分析其在提升业务敏捷性、降低成本和增强系统可靠性方面的实际效益。文章不仅阐述理论,更通过代码示例深入讲解云原生架构的关键组件如容器化、微服务和持续集成/持续部署(CI/CD)的实践应用。
70 0
|
运维 Cloud Native 云计算
云原生架构的演进与实践
在数字化浪潮的推动下,云原生技术以其弹性、可扩展和高度自动化的特性成为企业数字化转型的重要推手。本文从云原生的概念出发,探讨了其在现代IT架构中的演进路径,并通过具体案例分析云原生技术如何助力企业实现敏捷开发和高效运维。文章旨在为读者提供云原生技术实施的洞见,并预测其未来的发展方向。
|
Linux 网络安全 虚拟化
Ngnix04系统环境准备-上面软件是免费版的,下面是收费版的,他更快的原因使用了epoll模型,查看当前Linux系统版本, uname -a,VMWARE建议使用NAT,PC端电脑必须使用网线连接
Ngnix04系统环境准备-上面软件是免费版的,下面是收费版的,他更快的原因使用了epoll模型,查看当前Linux系统版本, uname -a,VMWARE建议使用NAT,PC端电脑必须使用网线连接
|
监控 前端开发 安全
【专栏】介绍了前端工程师如何掌握SSH命令,包括SSH协议的基础知识、命令行操作如登录、文件传输、目录管理和进程管理
【4月更文挑战第29天】本文介绍了前端工程师如何掌握SSH命令,包括SSH协议的基础知识、命令行操作如登录、文件传输、目录管理和进程管理。在前端开发中,SSH用于部署项目、协同后端开发及服务器监控。文章还强调了使用密钥认证、配置别名及安全注意事项,并提醒开发者面对问题时如何解决。学习和熟练运用SSH是前端工程师适应复杂项目需求的关键。
319 0