[SHOI2009]会场预约,洛谷之提高历练地,线段树树状数组基础

正题

       第四题:[SHOI2009]会场预约

      这题要做的操作就是,每次加入一个区间,删除与之有交的区间,输出个数。另外一个操作就是,输出当前的区间。

      我们可以用set来完成这个操作,找出右节点比当前区间左节点大(或等于)的区间,如果找出来的区间的左节点比当前区间的右节点还要小的话,那么就删除这个区间。

代码<教教你怎么用set>

#include
#include
#include
#include
using namespace std;

int n;
struct interval{
	int l,r;
	bool operator<(const interval y)const{//定义排序顺序
		return r s;//声明一个类型为interval的set
set ::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);
	}
}



      

你可能感兴趣的:([SHOI2009]会场预约,洛谷之提高历练地,线段树树状数组基础)