[SHOI2009]會場預約 線段樹

題目描述

PP大廈有一間空的禮堂,可以爲企業或者單位提供會議場地。這些會議中的大多數都需要連續幾天的時間(個別的可能只需要一天),不過場地只有一個,所以不同的會議的時間申請不能夠衝突。也就是說,前一個會議的結束日期必須在後一個會議的開始日期之前。所以,如果要接受一個新的場地預約申請,就必須拒絕掉與這個申請相沖突的預約。 一般來說,如果PP大廈方面事先已經接受了一個會場預約,例如從10日到15日,就不會在接受與之相沖突的預約,例如從12日到17日。不過,有時出於經濟利益,PP大廈方面有時會爲了接受一個新的會場預約,而拒絕掉一個甚至幾個之前預訂的預約。 於是,禮堂管理員QQ的筆記本上筆記本上經常記錄着這樣的信息: 本題中爲方便起見,所有的日期都用一個整數表示。例如,如果一個爲期10天的會議從“90日”開始到“99日”,那麼下一個會議最早只能在“100日”開始。 最近,這個業務的工作量與日俱增,禮堂的管理員QQ希望參加SHTSC的你替他設計一套計算機系統,方便他的工作。這個系統應當能執行下面兩個操作: A操作:有一個新的預約是從“start日”到“end日”,並且拒絕掉所有與它相沖突的預約。執行這個操作的時候,你的系統應當返回爲了這個新預約而拒絕掉的預約個數,以方便QQ與自己的記錄相校對。 B操作:請你的系統返回當前的仍然有效的預約的總數。

輸入輸出格式

輸入格式:

 

輸入文件的第一行是一個整數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

輸出樣例#1: 複製

0
0
2
0
1
2

說明

N< = 200000

1< = Start End < = 100000

 

思維難度:省選

代碼難度:省選

#include<cstdio>
#include<iostream>
using namespace std;
const int Maxn=200005;
const int inf=Maxn*2;
int n,des[Maxn];
struct tree{
	int x,l,r,c;
}t[Maxn*4];
struct node{
	char inc;int l,r,ans;
}que[Maxn];
inline int read(){
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c<='9'&&c>='0'){
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
}
inline int lson(int rt){
	return rt<<1;
}
inline int rson(int rt){
	return rt<<1|1;
}
inline int mn(int x,int y){
	return x<y?x:y; 
}
inline void pushup(int rt){
	t[rt].x=mn(t[lson(rt)].x,t[rson(rt)].x);
}
inline void build(int l,int r,int rt){
	t[rt].l=l;t[rt].r=r;
	if(l==r){
		t[rt].x=inf;
		return;
	}
	int mid=l+r>>1;
	build(l,mid,lson(rt));
	build(mid+1,r,rson(rt));
	pushup(rt);
}
inline void pushdown(int rt){
	if(t[rt].l==t[rt].r)return;
	if(t[rt].c==0)return;
	t[lson(rt)].c=t[rt].c;
	t[rson(rt)].c=t[rt].c;
	t[lson(rt)].x=t[rt].c;
	t[rson(rt)].x=t[rt].c;
	t[rt].c=0;
}
inline void update(int l,int r,int x,int rt){
	if(t[rt].l>=l&&t[rt].r<=r){
		t[rt].x=x;
		t[rt].c=x;
		return;
	}
	pushdown(rt);
	int mid=t[rt].l+t[rt].r>>1;
	if(l<=mid)update(l,r,x,lson(rt));
	if(r>mid)update(l,r,x,rson(rt));
	pushup(rt);
}
inline int query(int l,int r,int rt){
	if(t[rt].l>=l&&t[rt].r<=r){
		return t[rt].x;
	}
	pushdown(rt);
	int mid=t[rt].l+t[rt].r>>1,ans=inf;
	if(l<=mid){
		ans=mn(ans,query(l,r,lson(rt)));
	}
	if(r>mid){
		ans=mn(ans,query(l,r,rson(rt)));
	}
	return ans;
}
inline char getc(){
	char c=getchar();
	while(c!='B'&&c!='A'){
		c=getchar();
	}
	return c;
}
int main(){
	n=read();int sum=0;
	for(int i=1;i<=n;i++){
		que[i].inc=getc();
		if(que[i].inc=='B')continue;
		que[i].l=read();que[i].r=read();
	}
	build(1,200000,1);
	for(int i=n;i>=1;i--){
		if(que[i].inc=='A'){
			int tmp=query(que[i].l,que[i].r,1);
			if(tmp!=inf)que[tmp].ans++;
			update(que[i].l,que[i].r,i,1);
		}
	}
	for(int i=1;i<=n;i++){
		if(que[i].inc=='A'){
			printf("%d\n",que[i].ans);
			sum++;
			sum-=que[i].ans;
		}
		else{
			printf("%d\n",sum);
		}
	}
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章