lgP2161 會場預約

chenfy27發表於2024-07-14

在數軸上維護一個線段集合S,支援兩種操作:

  • A l r:將S中所有與線段[l,r]相關的線段刪除,並將[l,r]加入S中,需要輸出刪除個數。
  • B:查詢S中元素數量。

分析:過載小於號,如果x小於y,那麼x嚴格小於y,即x的右端點要小於y的左端點,這樣定義相交的線段都是相等的,可以用set來找。

#include <bits/stdc++.h>
using llong = long long;

struct Info {
    int l, r;
    bool operator<(const Info &rhs) const {
        return r < rhs.l;
    }
};

void solve() {
    std::set<Info> st;
    int n;
    std::cin >> n;
    for (int i = 0; i < n; i++) {
        std::string op;
        std::cin >> op;
        if (op == "A") {
            Info info;
            std::cin >> info.l >> info.r;
            int cnt = 0;            
            auto it = st.find(info);
            while (it != st.end()) {
                cnt += 1;
                st.erase(it);
                it = st.find(info);
            }
            st.insert(info);
            std::cout << cnt << "\n";
        } else if (op == "B") {
            std::cout << st.size() << "\n";
        }
    }
}

int main() {
    std::cin.tie(0)->sync_with_stdio(0);
    int t = 1;
    while (t--) solve();
    return 0;
}

相關文章