题解 | 剩下的树

剩下的树

https://www.nowcoder.com/practice/f5787c69f5cf41499ba4706bc93700a2

可应用区间合并的模板

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

using namespace std;

typedef pair<int, int> PII;

int n, m;
vector<PII> lvls;
vector<PII> res;

int main() {
	cin >> n >> m;

	while (m--) {
		int l, r;
		cin >> l >> r;
		lvls.push_back({ l, r });
	}

	// 对起始端点排序
	sort(lvls.begin(), lvls.end());  

	// 合并区间
	int st = -1, ed = -1;                   // 初始区间长度为0(不计入)
	for (auto lvl : lvls) {
		if (ed < lvl.first) {
			if (st != -1)                   // 不输出初始区间
				res.push_back({ st, ed });  // 上一个区间可输出
			st = lvl.first;
			ed = lvl.second;                // 选择当前区间
		}
		else {
			if (lvl.second > ed)            // 合并两区间(延长区间末尾)
				ed = lvl.second;
		}
	}

	// 要计入最后一个区间
	res.push_back({ st, ed });

	int cnt = n + 1;
	for (auto lvl : res) {
		cnt -= (lvl.second - lvl.first + 1);
	}

	cout << cnt << endl;
	return 0; 
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务