fhq_treap46pts求助
  • 板块P1503 鬼子进村
  • 楼主Tjqq
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/1/30 15:18
  • 上次更新2023/10/24 02:33:24
查看原帖
fhq_treap46pts求助
540665
Tjqq楼主2023/1/30 15:18
#include<cstdio>
#include<iostream>
#include<vector>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<ctime>
#include<cstdlib>
#define ll long long
#define INF_INT 0x3f3f3f3f
char Ch;
int ff;
inline void rd(int &x){
	x=0,ff=1,Ch=getchar();
	while((Ch<'0'||Ch>'9')&&Ch!='-')Ch=getchar();
	if(Ch=='-')Ch=getchar(),ff=-1;
	while(Ch>='0'&&Ch<='9'){
		x=(x<<1)+(x<<3)+Ch-'0';
		Ch=getchar();
	}
	x*=ff;
}
inline int random(int x){
	return (long long)rand()*rand()%x;
}
using namespace std;
const int N=1e5+5;
char op;  
int n,Q,cnt,Top;
bool t[N];
int s[N];
struct Fhq_Treap{
	int rt,rl,rr,tp;
	int sz[N],pro[N],val[N];
	int ch[N][2];
	int new_node(int x){
		sz[++cnt]=1;
		pro[cnt]=rand();
		val[cnt]=x;
		return cnt;
	}
	void push_up(int x){
		sz[x]=sz[ch[x][0]]+sz[ch[x][1]]+1;
	}
	void split(int x,int k,int &ls,int &rs){
		if(!x){
			ls=rs=0;
			return ;
		}
		if(val[x]<=k){
			ls=x;
			split(ch[ls][1],k,ch[ls][1],rs);
		}
		else{
			rs=x;
			split(ch[rs][0],k,ls,ch[rs][0]);
		}
		push_up(x);
	}
	int merge(int ls,int rs){
		if(!ls||!rs)return ls+rs;
		if(pro[ls]<=pro[rs]){
			ch[ls][1]=merge(ch[ls][1],rs);
			push_up(ls);
			return ls;	
		}
		else{
			ch[rs][0]=merge(ls,ch[rs][0]);
			push_up(rs);
			return rs;
		}
	}
	void dfs(int x){
		if(!x)return ;
		dfs(ch[x][0]);
		printf("%d ",val[x]);
		dfs(ch[x][1]);
	}
	void print(){
		puts("Treap:");
		dfs(rt);
		puts("");
	}
	void ins(int x){
		split(rt,x-1,rl,rr);
		rt=merge(rl,merge(new_node(x),rr));
	}
	int kth(int root,int k){
		int x=root,u;
		while(1){
			u=sz[ch[x][0]]+1;
			if(k==u)return val[x];
			if(k<u)x=ch[x][0];
			else k-=u,x=ch[x][1];
		}
	}
	int ask(int x){
		split(rt,x,rl,rr);
		int s1=kth(rl,sz[rl]),s2=kth(rr,1),ans=0;
//		printf("pre:%d  nxt:%d\n",s1,s2);
		ans=s2-s1-1;
		rt=merge(rl,rr);
		return ans;
	}
	void del(int x){
		split(rt,x,rl,rr);
		split(rl,x-1,rl,tp);
		tp=merge(ch[tp][0],ch[tp][1]);
		rt=merge(merge(rl,tp),rr);
	}
}tr;
int main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	scanf("%d %d",&n,&Q);
	tr.ins(0),tr.ins(n+1);
	for(int x;Q--;){
//		for(int i=1;i<=n;i++)
//			printf("%d ",t[i]);
//		puts("");
//		tr.print();
		scanf("\n%c",&op);
		if(op=='D'){
			scanf("%d",&x),s[++Top]=x;
			if(!t[x])
				tr.ins(x),t[x]=1;
		}
		if(op=='R'){
			tr.del(s[Top--]),t[x]=0;
		}
		if(op=='Q')
			scanf("%d",&x),t[x]?puts("0"):printf("%d\n",tr.ask(x));
	}
	return 0;
}
/*
lemon龙保佑我

*/
2023/1/30 15:18
加载中...