校门外的树:区间处理与标记法的C++实践(洛谷P1047)

校门外的树:区间处理与标记法的C++实践(洛谷P1047)

题目思路解析

这道题目要求我们计算在移除多个区间内的树木后,马路上剩余的树木数量。关键在于高效处理可能重叠的多个区间,并准确统计被移除的树木。

核心思考路径

  1. 问题建模:将马路抽象为0到l的连续区间
  2. 区间处理:标记所有需要移除树木的区间
  3. 结果计算:统计未被标记的树木数量

关键考核知识点

1. 数组标记法(⭐⭐⭐⭐⭐)

  • 布尔数组:用数组元素表示树木存在状态
  • 区间标记:将移除区间内的元素设为true
  • 状态统计:遍历统计未被标记的元素

2. 区间合并处理(⭐⭐⭐)

  • 重叠区间:处理多个区间可能重叠的情况
  • 端点处理:包含区间的两个端点
  • 效率优化:避免重复标记已移除的树木

3. 输入输出处理(⭐⭐)

  • 多组数据输入:正确处理m组区间数据
  • 边界值处理:验证u和v的合法性
  • 结果输出:按要求格式输出剩余树木数

C++完整实现

解法一:布尔数组标记法

#include <iostream> #include <vector> using namespace std; int main() { int l, m; cin >> l >> m; vector<bool> trees(l + 1, false); // false表示树存在 while (m--) { int u, v; cin >> u >> v; for (int i = u; i <= v; ++i) { trees[i] = true; // true表示树被移除 } } int count = 0; for (int i = 0; i <= l; ++i) { if (!trees[i]) ++count; } cout << count << endl; return 0; } 

解法二:区间端点优化法

#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int l, m; cin >> l >> m; vector<pair<int, int>> intervals; while (m--) { int u, v; cin >> u >> v; intervals.emplace_back(u, v); } // 按区间起点排序 sort(intervals.begin(), intervals.end()); int removed = 0; int last = -1; for (auto& interval : intervals) { int u = interval.first, v = interval.second; if (u > last) { removed += v - u + 1; last = v; } else if (v > last) { removed += v - last; last = v; } } cout << (l + 1 - removed) << endl; return 0; } 

代码解析与优化

1. 空间优化技巧

// 使用bitset减少空间占用 #include <bitset> bitset<10001> trees; // 替代vector<bool> 

2. 输入处理优化

// 快速IO加速 ios::sync_with_stdio(false); cin.tie(nullptr); 

3. 复杂度分析

实现方式时间复杂度空间复杂度适用场景
布尔数组O(m×l)O(l)l较小的情况
区间合并O(mlogm)O(m)m较小的情况

测试用例分析

测试案例输入预期输出验证要点
样例1500 3
150 300
100 200
470 471
298重叠区间处理
边界110 1
0 10
0全区间移除
边界2100 0101无移除区间
特殊110 2
1 5
6 10
1连续区间
特殊220 3
5 10
8 15
12 18
10多重重叠

常见错误与修正

错误1:数组越界

vector<bool> trees(l); // 错误:少一个元素 for (int i = 0; i <= l; ++i) // 越界访问 

修正

vector<bool> trees(l + 1); 

错误2:端点处理错误

for (int i = u; i < v; ++i) // 错误:漏掉v端点 

修正

for (int i = u; i <= v; ++i) 

错误3:计数错误

int count = l - removed; // 错误:忘记+1 

修正

int count = l + 1 - removed; 

竞赛技巧总结

  1. 问题抽象:将实际问题转化为区间处理问题
  2. 数据结构选择:根据数据范围选择合适的数据结构
  3. 边界检查:特别注意区间的端点处理
  4. 测试验证:设计多种测试案例验证算法

拓展思考

  1. 变形问题2:动态区间增加和查询
    • 使用线段树数据结构
    • 支持区间更新和区间查询
  2. 进阶挑战:处理超大l值(如1e9)
    • 使用离散化和区间合并
    • 减少空间使用量

变形问题1:求被移除次数最多的树

vector<int> count(l+1); // 记录每棵树被移除的次数 
"校门外的树问题教会我们如何用编程解决现实中的空间规划问题,是算法竞赛中经典的区间处理案例。"

关注并私信【校门外的树】可获得资源

  • 区间合并算法详解

Read more

Sambert-HiFiGAN调用教程:Python API接口使用代码实例

Sambert-HiFiGAN调用教程:Python API接口使用代码实例 1. 开箱即用的多情感中文语音合成体验 你有没有试过,输入一段文字,几秒钟后就听到自然、有情绪、像真人说话一样的中文语音?不是机械念稿,而是带着开心、温柔、坚定甚至略带俏皮语气的表达——Sambert-HiFiGAN 就是这样一款“开箱即用”的语音合成工具。 它不像很多TTS模型需要你手动下载权重、配置环境、编译C++依赖、反复调试CUDA版本……这个镜像已经把所有“拦路虎”提前清掉了。你只需要一行命令启动,再写几行Python代码,就能让文字真正“活起来”。 特别适合内容创作者、教育产品开发者、无障碍应用工程师,或者只是想给自家小工具加个语音播报功能的程序员。不需要语音学背景,也不用啃论文,今天这篇教程,就是为你写的。 2. 环境准备与一键部署 2.1 镜像核心能力说明 本镜像基于阿里达摩院开源的 Sambert-HiFiGAN 模型深度优化而来,重点解决了两个长期困扰用户的“硬伤”: * 彻底修复 ttsfrd(

By Ne0inhk
用 Python 调用 Bright Data MCP Server:在 VS Code 中实现实时网页数据抓取

用 Python 调用 Bright Data MCP Server:在 VS Code 中实现实时网页数据抓取

用 Python 调用 Bright Data MCP Server:在 VS Code 中实现实时网页数据抓取,本文介绍了Bright Data的Web MCP Server,这是一款能实现实时、结构化网页数据访问的API,适用于AI应用等场景。其支持静态与动态网页,前3个月每月提供5000次免费请求,有远程托管和本地部署两种方式。文章以在VS Code中用Python调用其API抓取Google搜索结果为例,详解了准备工作、代码编写、参数说明等实战流程,还提及该工具免维护代理池等技术亮点及使用限制。 一、引言:为什么AI时代需要高效的网页数据访问工具? 在大语言模型(LLM)和智能代理(Agent)快速发展的今天,"实时性"成为AI应用落地的关键瓶颈。想象一下:当你的AI助手需要回答"今天上海的天气预警"或"某款产品的最新用户评价"时,它必须依赖实时网页数据才能给出准确答案—

By Ne0inhk

基于 Python 深度学习的电影评论情感分析算法

Bi-LSTM 情感分析算法详解 博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w+、ZEEKLOG博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟 2022-2024年最全的计算机软件毕业设计选题大全:1000个热门选题推荐✅ Java项目精品实战案例《100套》 Java微信小程序项目实战《100套》 Python项目实战《100套》 感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及文档编写等相关问题都可以给我留言咨询,希望帮助更多的人 文章目录 * Bi-LSTM 情感分析算法详解 * 1. 算法概述 * 1.1 什么是 Bi-LSTM? * 为什么需要 LSTM? * 为什么需要双向? * 1.2 整体架构 * 2. 数据清洗与预处理 * 2.1 数据集介绍 * 2.2 情感标签生成

By Ne0inhk
不学 Python,Java 开发者怎么搞 AI Agent

不学 Python,Java 开发者怎么搞 AI Agent

Java 架构师的 AI 工程笔记——不学 Python,用 Spring Boot 搞 AI Agent 10 年 Java 后端,经历过从单体到微服务的架构迁移。去年开始带团队做第二次技术转型——把 AI 能力嵌入现有业务系统。 转型过程中发现一个尴尬的现实:大部分 AI 教程是 Python 的。LangChain、LlamaIndex、CrewAI……全是 Python 生态。Java 团队想搞 AI,难道要全员转 Python? 在项目里比较了 LangChain4j 和 Spring AI Alibaba 之后,我选了后者。原因很简单:Spring AI Alibaba

By Ne0inhk