在數軸上維護一個線段集合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;
}