当前位置: 首页 > 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.gsyq.cn/news/59614.html

相关文章:

  • P28_完整的模型训练套路(三)
  • 6个适合做 PoC 的开源无代码/低代码工具推荐
  • Rokid AI眼镜开发 —— 戴上Rokid Glasses的你有多强
  • 小额支付系统:详细处理逻辑(底层)
  • Day1 Scrum冲刺博客
  • CF1799G Count Voting 笔记
  • 2025年11月美国本科申请机构深度测评:藤校Offer领航者全解析
  • 踩坑日记20251124
  • 详细介绍:Nginx 高效动静分离:从原理到实战
  • C++语法基础
  • 2025美国留学中介实测榜单:从藤校到小众专业,核心竞争力深度对比!
  • 2025美国留学机构TOP榜:从申请到就业的全链条护航者
  • MySQL 数据备份 - 教程
  • 复制 deepseek think 思考 内容 的方法
  • 狂神说Java(基础版)
  • 2025优质留学中介全景推荐:从藤校OFFER到职业落地,谁是你的专属引路人?
  • zhengrui 喵了个喵
  • C#.NET PeriodicTimer 深入解析:高效异步定时器的正确打开方式 - 详解
  • 2025年11月留学机构实测:5家实力留学机构推荐,细分领域王牌都在这!
  • zhengrui 种花
  • 俄罗斯黑客承认协助阎罗王勒索软件入侵企业网络
  • [ImGui游戏设置UI模拟实践] ImGui Learn Data Day 2
  • 深入解析:java设计模式七、代理模式
  • Trick——语法
  • 老鼠和奶酪 记忆化搜索
  • 深入解析:数独解题算法lua脚本
  • Trae搭建Android 开发中 MVVM 架构,使用指南
  • CF2061H2 Kevin and Stones (Hard Version) 题解
  • winfrom 操作列 动态按钮
  • 蓝桥杯-Python-基础语法