Luogu P1382 Solution / 极短 STL 解法一则

题面

这里

其图片不言而喻,一目了然。

思路

扫描线,不需要线段树。

map 内开 multiset,存储加入线段/删除线段操作。

再开一个 multiset 存储目前横坐标上存在的楼房高度。

额外开一个 int 存储上一个横坐标最高楼房的高度,如果变化了,就先存储上一个横坐标的最高高度,再存储现在的最高高度。

vectorpair 存储答案。

时间复杂度 \(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);
    }
}
posted @ 2024-06-25 14:10  丝羽绫华  阅读(2)  评论(0编辑  收藏  举报