LeetCode #1288

Remove Covered Intervals

1개의 풀이 · C++

문제 원문 보기 ↗

SOLUTION INFO

C++ · main.cpp

main.cpp
class Solution {
public:
    int removeCoveredIntervals(vector<vector<int>>& intervals) {
        int N = 100001;
        vector<int> tree(N + 1);

        function<void(int, int)> update = [&](int x, int delta) -> void {
            for(int i = x; i <= N; i += i & -i) {
                tree[i] += delta;
            }
        };
        function<int(int)> query = [&](int x) -> int {
            int ret = 0;
            for(int i = x; i > 0; i -= i & -i) {
                ret += tree[i];
            }
            return ret;
        };

        int M = (int)intervals.size();
        vector<pair<int, int>> V;
        for(int i = 0; i < M; ++i) {
            int l = intervals[i][0] + 1, r = intervals[i][1] + 1;
            V.emplace_back(l, 1);
            V.emplace_back(r, -l);
        }
        sort(V.begin(), V.end());

        int ans = 0;
        for(auto [x, t]: V) {
            if(t == 1) {
                update(x, 1);
            }
            else {
                int chk = query(-t);
                if(chk == 1) ++ ans;
                update(-t, -1);
            }
        }
        return ans;
    }
};

/*
이거는 L 넣고 R이 온 순간에 L 이하에 있는 값들이 살아있다면 covered 되는 경우
그렇다면 이거는 음 세그를 쓰는게 나을듯한데
l과 r 타입 구분은 0 1 로 해도 되긴 하는데 r일땐 l 값을 알고 있어야 함.

그니깐 r이 나온 시점에 그 l보다 작거나 같고
*/

SOLUTION DESCRIPTION

풀이 설명

등록된 풀이 설명이 없습니다.