Luogu P1382 Solution / 极短 STL 解法一则
题面
在这里。
其图片不言而喻,一目了然。
思路
扫描线,不需要线段树。
在 map
内开 multiset
,存储加入线段/删除线段操作。
再开一个 multiset
存储目前横坐标上存在的楼房高度。
额外开一个 int
存储上一个横坐标最高楼房的高度,如果变化了,就先存储上一个横坐标的最高高度,再存储现在的最高高度。
用 vector
套 pair
存储答案。
时间复杂度 \(O(n\log n+m)\)。
代码
格式化后仅有 \(780\) 字节。
#include <iostream>
#include <set>
#include <vector>
#include <map>
using namespace std;
const int N = 1e5 + 10;
using pii = pair<int, int>;
map<int, multiset<pii>> stt;
multiset<int, greater<int>> cur;
int n, ltt;
vector<pii> res;
int main()
{
cur.insert(0);
scanf("%d", &n);
for (int i = 1, x, y, z; i <= n; i++)
{
scanf("%d%d%d", &x, &y, &z);
stt[y].insert({1, x});
stt[z].insert({0, x});
}
for (auto &[k, v] : stt)
{
for (auto &[x, y] : v)
{
if (x)
cur.insert(y);
else
cur.erase(cur.find(y));
}
if (*cur.begin() != ltt)
{
res.push_back({k, ltt});
ltt = *cur.begin();
res.push_back({k, ltt});
}
}
printf("%d\n", res.size());
for (auto &[x, y] : res)
{
printf("%d %d\n", x, y);
}
}