当前位置: 首页 > news >正文

CCF-CSP第25次认证第二题——出行计划【NA!重难点在于理解为什么答案是 cnt1−cnt2】

CCF-CSP第25次认证第二题——出行计划

官网链接:TUOJ

参考题解【逻辑简单直接但时间复杂度不达标】

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

typedef pair <int, int> PII;

int main () {
	ios::sync_with_stdio(false);
	cin.tie(0);
	
	int n, m, k; //计划数,查询个数,等待时间
	cin >> n >> m >> k;
	
//	vector<PII> plan(n + 1); //出行计划的时刻和核酸要求 
	vector<PII> region(n + 1);//每个计划可行的做核酸时间范围 
	for(int i = 1; i <= n; i++) {
		int t, c;
		cin >> t >> c;
//		plan[i] = {t, c};
		region[i] = {t - k - c + 1, t - k};
	} 
	sort(region.begin(), region.end());
	
	for(int i = 1; i <= m; i++) {
		int query;//查询,即该时刻做核酸
		cin >> query;
		int count = 0;//可行的计划数 
		
		for(int i = 1; i <= n; i++) {
			if(region[i].first > query) break;
			if(region[i].first <= query && query <= region[i].second) {
				count++;
			}
		} 
		
		cout << count << endl;
	}
	
	return 0;
}

优化版【二分查找思想】

  • 每个查询由原来的 O(n) 线性扫描,优化为 O(log⁡n) 的二分查找,从而整体时间复杂度降低为 O(nlog⁡n+mlog⁡n) 
  • 这种方法在 n,m≤10^5 的情况下非常高效,能满足题目的时间要求。
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

typedef pair <int, int> PII;

int main () {
	ios::sync_with_stdio(false);
	cin.tie(0);
	
	int n, m, k; //计划数,查询个数,等待时间
	cin >> n >> m >> k;
	
	vector<int> starts(n + 1), ends(n + 1); //分别存储每个计划可行的做核酸的最早时间和最晚时间 
	for(int i = 1; i <= n; i++) {
		int t, c;
		cin >> t >> c;
		starts[i] = t - k - c + 1;
		ends[i] = t - k;
	} 
	sort(starts.begin(), starts.end());
	sort(ends.begin(), ends.end());
	
	while(m--) {
		int q;//查询,即该时刻做核酸
		cin >> q;
		
		// 找第一个 > q 的起点----看有多少个区间的起点<=q 
        int cnt1 = upper_bound(starts.begin(), starts.end(), q) - starts.begin();
        // 找第一个 >= q 的终点,数量即 <q 的数目
        int cnt2 = lower_bound(ends.begin(), ends.end(), q) - ends.begin();
        cout << cnt1 - cnt2 << endl;
	}
	
	return 0;
}

总结

重难点在于理解为什么答案是 cnt1−cnt2

  • cnt1cnt1cnt1: 统计所有满足 s≤q 的区间个数,即这些区间已经开始。
  • cnt2cnt2cnt2: 统计所有满足 e<q 的区间个数,即这些区间已经结束(不再包含 q)。

因此,满足 s≤q≤e 的区间数量,就是“已开始但未结束”的区间数量,即:

答案=已开始区间数−已结束区间数=cnt1−cnt2

相关文章:

  • 【开源宝藏】30天学会CSS - DAY3 第三课 滑动文本+变色
  • 【简单有效!】Gradio利用html插件实现video视频流循环播放
  • WebSocket:开启实时通信的新篇章
  • 图论——Prim算法
  • Nacos集群部署与高可用架构实战指南
  • 【RHCE】awk文本处理
  • 在 Go 语言中生成单元测试报告
  • 巧用符号链接搬移C盘中的软件数据目录到其他盘
  • uniapp可拖拽消息数徽标draggable-badge,仿手机qq聊天列表未读数徽标动效
  • WDG看门狗
  • 【大语言模型_7】利用ragas框架评测rag系统指标
  • [杂学笔记]继承的应用场景、如何避免内存泄漏、函数模板的理解、多线程的应用场景、DNS解析的过程
  • 深入解析 DAI 与 SAI:Linux 音频驱动中的核心概念
  • armsom产品qt交叉编译
  • K8S学习之基础三十六:node-exporter部署
  • Linux中vscode编程,小白入门喂饭级教程
  • tailwindCss中中括号([])的作用
  • 【Nodejs】2024 汇总现状
  • 平板作为笔记本副屏使用spacedesk
  • AI大模型在物联网行业的应用场景深度解析
  • 交通运输部、水利部同日召开会议,深刻汲取贵州游船倾覆事故教训
  • 库里22分赢下抢七大战,火箭十年难破“火勇大战”的魔咒
  • 想要“逆转”糖尿病,减少这两处脂肪是关键
  • 中国海警局回应日本民用飞机侵闯我钓鱼岛领空:依法警告驱离
  • 中虎跳峡封闭仍有游客逆行打卡,景区:专人值守防意外
  • 海外考古大家访谈|斯文特·帕波:人类进化遗传学的奠基者