正题
第四题:[SHOI2009]会场预约
这题要做的操作就是,每次加入一个区间,删除与之有交的区间,输出个数。另外一个操作就是,输出当前的区间。
我们可以用set来完成这个操作,找出右节点比当前区间左节点大(或等于)的区间,如果找出来的区间的左节点比当前区间的右节点还要小的话,那么就删除这个区间。
代码<教教你怎么用set>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<set>
using namespace std;
int n;
struct interval{
int l,r;
bool operator<(const interval y)const{//定义排序顺序
return r<y.r;
}
};
set<interval> s;//声明一个类型为interval的set
set<interval> ::iterator it;//声明一个指向interval类型的set指针
int tot=0,ans=0;
int main(){
scanf("%d",&n);
int x,y;
for(int i=1;i<=n;i++){
char c[2];
scanf("%s",c);
if(c[0]=='A'){
tot=0;
scanf("%d %d",&x,&y);
while(1){
it=s.lower_bound((interval){0,x});//求比 (0,x)数对 大 的区间 , 让it指向这个interval。
if(it!=s.end() && it->l<=y) s.erase(it),tot++,ans--; else break;//erase是删除
}
s.insert((interval){x,y});
ans++;
printf("%d\n",tot);
}
else printf("%d\n",ans);
}
}