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

洛谷 P1496:火烧赤壁 ← 离散化(数组 + sort + STL map)

【题目来源】
https://www.luogu.com.cn/problem/P1496

【题目描述】
曹操平定北方以后,公元 208 年,率领大军南下,进攻刘表。他的人马还没有到荆州,刘表已经病死。他的儿子刘琮听到曹军声势浩大,吓破了胆,先派人求降了。
孙权任命周瑜为都督,拨给他三万水军,叫他同刘备协力抵抗曹操。
隆冬的十一月,天气突然回暖,刮起了东南风。
没想到东吴船队离开北岸大约二里距离,前面十条大船突然同时起火。火借风势,风助火威。十条火船,好比十条火龙一样,闯进曹军水寨。那里的船舰,都挤在一起,又躲不开,很快地都烧起来。一眨眼工夫,已经烧成一片火海。
曹操气急败坏的把你找来,要你钻入火海把连环线上着火的船只的长度统计出来!

【输入格式】
给定每个起火部分的起点和终点,请你求出燃烧位置的长度之和。

【输出格式】
第一行一个整数,表示起火的信息条数 n。
接下来 n 行,每行两个整数 a,b,表示一个着火位置的起点和终点(注意:左闭右开)。

【数据规模与约定】
对于全部的测试点,保证 1≤n≤2×10^4,−2^31≤a<b<2^31,且答案小于 2^31。

【输入样例】
3
-1 1
5 11
2 9

【输出样例】
11

【算法分析】
● 可以看出,这道题给的区间相对较少,只有 2×10^4 组区间。但是,每组区间端点的值域很大,可达 2^31-(-2^31) 个整数,约 16GB 大小。显然,已超出算法竞赛的内存上限(通常在 ‌64MB ~ 512MB‌ 之间)。故若采用暴力法进行染色标记,根本行不通。因为,根本开不了这么大的数组。 因此可以通过离散化,将 n 组区间的左右端点进行映射,总共 n 组区间,每组区间两个数,即共有 2*n 个端点,所以只需要开 2*n 的数组大小即可。

● 区间端点的值域(−2^31≤a<b<2^31)含有负数,无法作为数组下标。所以,从这个角度看,也得进行离散化。

● 离散化是一种数据处理的技巧。通过离散化,可以将稀疏的大范围数据映射为紧凑的整数序列,同时保持数据相对大小关系不变,既节省空间又提升访问效率,特别适合需要频繁随机访问的场景。可以进行离散化的数据有大整数、浮点数、字符串等。

● 简单而言,常用的离散化算法步骤为“提取、排序、去重、映射”。

【算法代码:数组 + sort + STL map

#include <bits/stdc++.h>
using namespace std;const int maxn=2e4+5;
int fi[maxn],se[maxn];
int a[maxn<<1],t[maxn<<1];
bool st[maxn<<1];
map<int,int> mp;
int len,cnt,ans;int main() {int n;cin>>n;for(int i=1; i<=n; i++) {cin>>fi[i]>>se[i];a[++len]=fi[i];a[++len]=se[i];}sort(a+1,a+len+1);for(int i=1; i<=len; i++) { //discretizationif(mp.find(a[i])==mp.end()) {t[++cnt]=a[i];mp[a[i]]=cnt;}}for(int i=1; i<=n; i++) { //Left-Closed Right-Openint le=mp[fi[i]];int ri=mp[se[i]];for(int j=le; j<ri; j++) {st[j]=true;}}for(int i=1; i<cnt; i++) {if(st[i]) ans+=(t[i+1]-t[i]);}cout<<ans<<endl;return 0;
}/*
in:
3
-1 1
5 11
2 9out:
11
*/

 

 【参考文献】
https://mp.weixin.qq.com/s/l8rlB083xMXf06xt1KqAtA
https://www.cnblogs.com/Yukie/p/17924367.html
https://blog.csdn.net/hnjzsyjyj/article/details/145073398
https://www.acwing.com/solution/content/22662/
https://www.acwing.com/solution/content/195136/
https://www.acwing.com/solution/content/174428/
https://blog.csdn.net/hnjzsyjyj/article/details/130179373
https://blog.csdn.net/hnjzsyjyj/article/details/143275575
https://blog.csdn.net/hnjzsyjyj/article/details/143309807
https://blog.csdn.net/hnjzsyjyj/article/details/143315085

http://www.jsqmd.com/news/49772/

相关文章:

  • P28_完整的模型训练套路(三)
  • 奶酪和机器人 非标准化的步数遍历
  • 6个适合做 PoC 的开源无代码/低代码工具推荐
  • 2025年度木门厂商推荐榜单与选择指南:一份基于行业专业数据的权威分析报告,整木/实木/原木门十大主流供应商解析
  • C# Quartz 定损执行 - microsoft
  • 2025美国本科申请中介深度解析:适配不同背景的梦校推手,谁能助你敲开美国名校门?
  • Rokid AI眼镜开发 —— 戴上Rokid Glasses的你有多强
  • 机器人的记忆化搜索
  • # 数据库对AI向量语义搜索的支持深度分析:PostgreSQL、MySQL、Elasticsearch技术选型指南
  • # 编程十四年感悟:复杂度管理与工程实践
  • Ai元人文:行为化不是放弃概念,而是通往概念的坚实阶梯
  • 基于RS485通讯及Modbus通讯协议的温湿度变送器
  • 小额支付系统:详细处理逻辑(底层)
  • “大概率上涨”的推荐
  • Day1 Scrum冲刺博客
  • 六、设备树与设备树插件
  • 【设计模式笔记06】:单一职责原则 - 实践
  • 102302124_严涛_作业3
  • CF1799G Count Voting 笔记
  • 2025年11月美国本科申请机构深度测评:藤校Offer领航者全解析
  • 20251124 - 月度检测 总结
  • 2026美国硕士留学中介推荐:从背景提升到签证获批全程护航!
  • 踩坑日记20251124
  • 2025年度楼梯厂商推荐榜单与选择指南:一份基于行业专业数据的权威分析报告,整木/实木/原木等材质楼梯十大主流供应商解析
  • Consciousness Preservation and Synthetic Life
  • 详细介绍:Nginx 高效动静分离:从原理到实战
  • C++语法基础
  • 2025美国留学中介实测榜单:从藤校到小众专业,核心竞争力深度对比!
  • MySQL 数据备份 - 教程
  • 复制 deepseek think 思考 内容 的方法