NC20414. [SHOI2009]会场预约
描述
输入描述
输入文件的第一行是一个整数n,表示你的系统将接受的操作总数。
接下去n行每行表示一个操作。每一行的格式为下面两者之一: “A start end”表示一个A操作; “B”表示一个B操作。
输出描述
输出文件有n行,每行一次对应一个输入。表示你的系统对于该操作的返回值。
示例1
输入:
6 A 10 15 A 17 19 A 12 17 A 90 99 A 11 12 B
输出:
0 0 2 0 1 2
C++(clang++11) 解法, 执行用时: 91ms, 内存消耗: 888K, 提交时间: 2021-02-14 13:09:34
#include<cstdio> #include<iostream> #include<set> using namespace std; const int N=2e5+10; int n,l,r,cnt; char op; struct node{ int l,r; bool operator<(const node&rhs)const{ return r<rhs.r;}//按照区间右端排序 }; set<node>s; int main() { //freopen("in.txt","r",stdin); std::ios::sync_with_stdio(false); cin>>n; while(n--) { cin>>op; if(op=='A') { cin>>l>>r; cnt=0; node tmp;tmp.l=l,tmp.r=r; while(1) { set<node>::iterator it=s.lower_bound(tmp);//找到指向≥tmp的元素的迭代器 if(it->l<=tmp.r&&it->r>=tmp.l)//有冲突 { s.erase(it);cnt++;continue; } if(it!=s.begin())it--;//往回再找 可能还有 if(it->l<=tmp.r&&it->r>=tmp.l) { s.erase(it);cnt++;continue; } s.insert(tmp);break; } printf("%d\n",cnt); } else printf("%d\n",s.size()); } return 0; }