这一题是用来练习stl的,,,
stl的set固然很方便, 但是在c++98里erase好像是没有返回值的, 不能像c++11一样it = S.erase(it);
所以c++98里删掉以后最好重新找以防RE.
具体在这道题中, 就是每一次lower_bound以后看看能不能删前面的或者后面的. c++98真是反人类啊...什么时候noip能够用c++11呢.#include#include #include #include #include #include using namespace std;typedef pair P;const int MAXN = 200000 + 10;inline int read(){ char ch = getchar(); int x = 0; while(!isdigit(ch)) ch = getchar(); while(isdigit(ch)) x = x * 10 + ch - '0', ch = getchar(); return x;}int N;set S;int main(){ // freopen("p2161.in", "r", stdin); // freopen("p2161.out", "w", stdout); cin>>N; while(N--) { char opt; scanf(" %c", &opt); if(opt == 'A') { int l = read(), r = read(); P cur = P(l, r); int cnt = 0; set
::iterator it; while(true) { it = S.lower_bound(cur); bool flag = false; if(it->first <= r && it->second >= l) ++cnt, S.erase(it), flag = true; it = S.lower_bound(cur); if(it != S.begin()) { --it; if(it->first <= r && it->second >= l) ++cnt, S.erase(it), flag = true; } if(!flag) break; } S.insert(cur); printf("%d\n", cnt); } else printf("%d\n", (int)S.size()); } return 0;}