luogu P2161 [SHOI2009]会场预约

luogu P2161 [SHOI2009]会场预约

题解

因为区间直接肯定是没有交集的
所以每次 A 的时候就找接近ed 的区间的左端点
树状数组维护左端点
如果相交就删掉
然后每个区间最多被加入和删掉一次
所以时间复杂度是两个log 的
然后这题就没了

code:


#include<bits/stdc++.h>
#define N 2000005
#define lowbit(x) (x & -x)
using namespace std;
int tree[N], a[N], n;
void update(int x, int y){
	for(; x < N; x += lowbit(x)) tree[x] += y;
}
int query(int x){
	int ret = 0;
	for(; x; x -= lowbit(x)) ret += tree[x];
	return ret;
}
int main(){
	scanf("%d", &n);
	int ans = 0;
	while(n --){
		int st, ed, gs = 0, del = 0;
		char c;
		scanf(" %c", &c);
		if(c == 'A'){
			ans ++;
			scanf("%d%d", &st, &ed);
			int l = 0, r = ed;
			while(1){
				gs = query(ed);
				int l = 0, r = ed + 1;
				while(l + 1 < r){
					int mid = (l + r) >> 1;
					if(gs - query(mid)) l = mid;
					else r = mid;
				}
				if(a[r] >= st) del ++, update(r, -1), a[r] = 0, ans --;
				else break;
			}
			a[st] = ed; update(st, 1);
			printf("%d\n", del);	
		}else printf("%d\n", ans);
		
	}
	return 0;
}
posted @ 2019-09-28 11:05  lahlah  阅读(25)  评论(0编辑  收藏  举报