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;
}