题目大意:有两种操作:
- $A\;l\;r:$表示加入区间$[l,r]$,并把与之冲突的区间删除,输出删除的区间的个数,区间$A$于区间$B$冲突当且仅当$A\cap B\not=\varnothing$
- $B:$输出现在有几个区间
题解:用$STL$的$set$,定义区间$A<B$为$A.r<B.l$,这样寻找冲突的区间只需要在$set$中$find$即可,注意删除后$set$指针不可用,需要重新找
卡点:无
C++ Code:
#include <cstdio>
#include <set>
int n;
struct Interval {
int l, r;
inline Interval() {}
inline Interval(int __l, int __r) : l(__l), r(__r) {}
inline friend bool operator < (const Interval &lhs, const Interval &rhs) {
return lhs.r < rhs.l;
}
} ;
std::set<Interval> S;
int main() {
scanf("%d", &n);
while (n --> 0) {
char op;
scanf("%1s", &op);
if (op == 'A') {
int a, b, res = 0;
scanf("%d%d", &a, &b);
Interval now(a, b);
std::set<Interval>::iterator it = S.find(now);
while (it != S.end()) {
S.erase(it);
res++;
it = S.find(now);
}
S.insert(now);
printf("%d\n", res);
} else printf("%llu\n", S.size());
}
return 0;
}