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

题解:洛谷 P1496 火烧赤壁

【题目来源】

洛谷:P1496 火烧赤壁 - 洛谷

【题目描述】

曹操平定北方以后,公元 \(208\) 年,率领大军南下,进攻刘表。他的人马还没有到荆州,刘表已经病死。他的儿子刘琮听到曹军声势浩大,吓破了胆,先派人求降了。

孙权任命周瑜为都督,拨给他三万水军,叫他同刘备协力抵抗曹操。

隆冬的十一月,天气突然回暖,刮起了东南风。

没想到东吴船队离开北岸大约二里距离,前面十条大船突然同时起火。火借风势,风助火威。十条火船,好比十条火龙一样,闯进曹军水寨。那里的船舰,都挤在一起,又躲不开,很快地都烧起来。一眨眼工夫,已经烧成一片火海。

曹操气急败坏的把你找来,要你钻入火海把连环线上着火的船只的长度统计出来!

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

【输入】

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

【输出】

输出一行一个整数表示答案。

【输入样例】

3
-1 1
5 11
2 9

【输出样例】

11

【算法标签】

《洛谷 P1496 火烧赤壁》 #离散化# #O2优化#

【代码详解】

#include <bits/stdc++.h>
using namespace std;#define int long long  // 定义int为long long类型int n;                  // 线段数量
int st, ed;             // 当前合并区间的起点和终点
int sum;                // 合并后的总长度// 线段结构体
struct Line 
{int l, r;           // 线段的起点和终点// 重载小于运算符,用于排序bool operator < (Line &t) {return l < t.l;}
} a[20005];             // 存储所有线段signed main()
{// 输入线段数量cin >> n;// 输入每条线段的起点和终点for (int i = 1; i <= n; i++){cin >> a[i].l >> a[i].r;}// 按线段起点排序sort(a + 1, a + n + 1);// 初始化第一个合并区间st = a[1].l;ed = a[1].r;sum += a[1].r - a[1].l;// 遍历处理每条线段for (int i = 2; i <= n; i++) {// 如果当前线段与合并区间有重叠if (a[i].l <= ed) {// 完全被包含则跳过if (a[i].r < ed)  {continue;}// 否则扩展合并区间else {st = ed;            // 更新起点为原终点ed = a[i].r;        // 更新终点为新线段的终点sum += ed - st;     // 增加扩展部分的长度}}// 如果没有重叠,创建新的合并区间else {st = a[i].l;ed = a[i].r;sum += ed - st;}}// 输出合并后的总长度cout << sum << endl;return 0;
}
// 使用acwing模板二刷
#include <bits/stdc++.h>
using namespace std;#define int long long  // 定义int为long long类型
const int N = 2005;    // 定义最大线段数量
typedef pair<int, int> PII;  // 定义线段类型为pairint n;                  // 线段数量
int sum;                // 合并后的总长度
vector<PII> segs;       // 存储所有线段的容器/*** 合并重叠或相邻的线段* @param segs 待合并的线段集合(引用传递)*/
void merge(vector<PII> &segs)
{  vector<PII> res;    // 存储合并后的结果sort(segs.begin(), segs.end());  // 按线段起点排序int st = -2e9, ed = -2e9;  // 初始化当前合并区间为极小值// 遍历所有线段for (auto seg : segs){// 如果当前线段与合并区间无重叠if (ed < seg.first){// 如果不是初始状态,保存当前合并区间if (st != -2e9) res.push_back({st, ed});// 开始新的合并区间st = seg.first;ed = seg.second;}// 如果有重叠,扩展当前合并区间elseed = max(ed, seg.second);}// 保存最后一个合并区间if (st != -2e9) res.push_back({st, ed});segs = res;  // 更新线段集合为合并后的结果
}signed main()
{// 输入线段数量cin >> n;// 输入每条线段的起点和终点for (int i = 1; i <= n; i++){int l, r;cin >> l >> r;segs.push_back({l, r});}// 合并线段merge(segs);// 计算合并后的总长度for (int i = 0; i < segs.size(); i++)sum += segs[i].second - segs[i].first;// 输出结果cout << sum << endl;return 0;
}

【运行结果】

3
-1 1
5 11
2 9
11
http://www.jsqmd.com/news/392439/

相关文章:

  • 2026年仿真计算对电脑的要求深度解析:从硬件选型到算力专业的方案的全维度适配指南
  • 题解:洛谷 P3397 地毯
  • 题解:洛谷 P2367 语文成绩
  • 孤能子视角:全国女婿回丈母娘家 全国儿媳在婆家的统一状态
  • 深入解析:Transformer 大模型架构深度解析(2)RNN 循环神经网络模型在 NLP 中的应用
  • 踩下电门的时候有没有想过,你脚下的电流到底经历了多少层运算?今天咱们扒开某新能源车企研发部的仿真模型,看看他们怎么用Simulink把电动车拆解得明明白白
  • AI大模型学习路线图:小白也能轻松入门,内含收藏资源包!AI大模型学习路线及相关资源推荐
  • 小白/程序员必看:2026年AI大模型生产力转型与Agentic AIOps落地指南
  • Qwen3.5:开启智能体时代,收藏这份国产大模型学习指南!
  • 2026年Q1宁波靠谱装修设计公司盘点:口碑榜单大公开 - 疯一样的风
  • 题解:洛谷 P1314 [NOIP 2011 提高组] 聪明的质监员
  • 大模型算法岗平均月薪达6.8w?程序员小白转行必看:AI大模型训练师的机遇与未来
  • AI入坑指南:收藏这份岗位选择攻略,小白也能快速找到适合你的方向
  • Android开发工程师面试题与答案集
  • 企业H5站点升级PWA (九)
  • 题解:洛谷 P1719 最大加权矩形
  • 题解:洛谷 P8218 【深进1.例1】求区间和
  • 题解:洛谷 P1069 [NOIP 2009 普及组] 细胞分裂
  • Android Framework 开发工程师
  • AI原生应用个性化定制,提升产品差异化
  • 价值投资的核心原则:安全边际
  • 惊!生成随机数居然不用随机数库?4行代码吃透随机本质
  • RabbitMQ在大数据数据可视化中的应用
  • 题解:洛谷 P1593 因子和
  • 数据产品国际化:多语言与多地区支持方案
  • 细胞生物化学仿真软件:VCell_(3).用户界面和基本操作
  • 一文搞懂【RAG技术】- 趣味解读RAG 高效召回秘籍之索引扩展:核心原理+实战案例
  • 细胞生物化学仿真软件:VCell_(1).VCell软件概述
  • 企业H5站点升级PWA (八)
  • 题解:洛谷 P1072 [NOIP 2009 提高组] Hankson 的趣味题