mayoko’s diary

プロコンとかいろいろ。

Educational Codeforces Round 4 D. The Union of k-Segments

解法

未だに問題の意味が正確にはわからないのでアレなんですが, 現れる数ごとに区間が重なっている数を +1, -1 していって, 重なる数が k 以上のところを取り出していけば良いです。

int main() {
    int n, k;
    cin >> n >> k;
    vector<pii> memo;
    for (int i = 0; i < n; i++) {
        int l, r;
        scanf("%d %d", &l, &r);
        memo.emplace_back(l, 0);
        memo.emplace_back(r, 1);
    }
    sort(memo.begin(), memo.end());
    vector<pii> ans;
    int cnt = 0;
    for (auto p : memo) {
        if (p.second == 0) {
            if (++cnt == k) ans.emplace_back(p.first, 0);
        } else {
            if (cnt-- == k) ans.back().second = p.first;
        }
    }
    cout << ans.size() << endl;
    for (auto p : ans) printf("%d %d\n", p.first, p.second);
    return 0;
}