WHY 37pts
查看原帖
WHY 37pts
1329138
luogu_hezhenmin1楼主2025/1/24 21:03
#include<bits/stdc++.h>
using namespace std;
const int N=50010;
int tr[N<<2],pre[N<<2],suf[N<<2];
int h[N];
bool vis[N];
void push_up(int p,int len){
	pre[p]=pre[p<<1];
	suf[p]=suf[p<<1|1];
	if(pre[p<<1]==(len-(len>>1))) pre[p]=pre[p<<1]+pre[p<<1|1];
	if(suf[p<<1|1]==(len>>1)) suf[p]=suf[p<<1]+suf[p<<1|1];
} 
void build(int p,int pl,int pr){
	if(pl==pr){
		tr[p]=suf[p]=pre[p]=1;
		return;
	}
	int mid=(pl+pr)>>1;
	build(p<<1,pl,mid);
	build(p<<1|1,mid+1,pr);
	push_up(p,pr-pl+1); 
}
void update(int x,int c,int p,int pl,int pr){
	if(pl==pr){
		tr[p]=suf[p]=pre[p]=c;
		return;
	}
	int mid=(pl+pr)>>1;
	if(x<=mid) update(x,c,p<<1,pl,mid);
	else update(x,c,p<<1|1,mid+1,pr);
	push_up(p,pr-pl+1);
}
int query(int x,int p,int pl,int pr){
	if(pl==pr) return tr[p];
	int mid=(pl+pr)>>1;
	if(x<=mid){
		if(x+suf[p<<1]>mid) return suf[p<<1]+pre[p<<1|1];
		else return query(x,p<<1,pl,mid);
	}
	else{
		if(mid+pre[p<<1|1]>=x) return pre[p<<1|1]+suf[p<<1];
		else return query(x,p<<1,mid+1,pr);
	}
}
int main(){
	int n,m,x,cnt=0;
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n>>m;
	build(1,1,n);
	while(m--){
		char op[10];
		cin>>op;
		if(op[0]=='Q'){
			cin>>x;
			if(vis[x]==1) cout<<0<<'\n';
			else cout<<query(x,1,1,n)<<'\n';
		}
		else if(op[0]=='D'){
			cin>>x;
			h[++cnt]=x;
			vis[x]=1;
			update(x,0,1,1,n);
		}
		else{
			x=h[cnt--];
			vis[x]=0;
			update(x,1,1,1,n);
		}
	}
	return 0;
}

rt

2025/1/24 21:03
加载中...