tell a joke.
查看原帖
tell a joke.
364122
BigJoker楼主2023/8/21 21:00

这题我 fhq 的 rk 赋的 1,然后全过了。

#include<bits/stdc++.h>
#define mem(a,x) memset(a,x,sizeof(a))
#define re register
#define il inline
using namespace std;
const int N=5e6+5;
struct fhq_treap{
	int idx,rt,tag[N],ls[N],rs[N],sz[N],rk[N],pos;
	int u,v,mid;
	char s[N];
	il int add(char x){
		s[++idx]=x,sz[idx]=1,rk[idx]^=1;
		return idx;
	}
	il void pushup(int p){
		sz[p]=sz[ls[p]]+sz[rs[p]]+1;
	}
	il void flip(int x){
		tag[x]^=1,swap(ls[x],rs[x]);
	}
	il void pushdown(int p){
		if(tag[p]){
			if(ls[p]) flip(ls[p]);
			if(rs[p]) flip(rs[p]);
			tag[p]=0;
		}
	}
	il int merge(int u,int v){
		if(!u || !v) return u+v;
		if(rk[u]<rk[v]){
			pushdown(u),rs[u]=merge(rs[u],v),pushup(u);
			return u;
		}
		else{
			pushdown(v),ls[v]=merge(u,ls[v]),pushup(v);
			return v;
		}
	}
	il void split(int p,int k,int &x,int &y){
		if(!p){
			x=y=0;
			return ;
		}
		pushdown(p);
		if(sz[ls[p]]+1<=k) x=p,split(rs[p],k-sz[ls[p]]-1,rs[p],y);
		else y=p,split(ls[p],k,x,ls[p]);
		pushup(p);
	}
	il void reverse(int x){
		int l=pos+1,r=l+x-1;
		split(rt,r,u,v),split(u,l-1,u,mid);
		flip(mid);
		rt=merge(merge(u,mid),v);
	}
	il void insert(int len){
		getchar();
		int l,mid=0,r;
		while(len--)
			mid=merge(mid,add(getchar()));
		split(rt,pos,l,r);
		rt=merge(merge(l,mid),r);
	}
	il void erase(int x){
		int l=pos+1,r=l+x-1;
		split(rt,r,u,v),split(u,l-1,u,mid);
		rt=merge(u,v);
	}
	il char print(int p,int x){
		pushdown(p);
		if(sz[ls[p]]+1==x) return s[p];
		if(sz[ls[p]]>=x) return print(ls[p],x);
		return print(rs[p],x-sz[ls[p]]-1);
	}
	il void pre(){
		pos--;
	}
	il void nxt(){
		pos++;
	}
	il void move(int x){
		pos=x;
	}
}t;
int main(){
	int _;
	cin>>_;
	while(_--){
		string op;
		int k,x;
		cin>>op;
		if(op=="Move"){
			scanf("%d",&k);
			t.move(k);
		}
		if(op=="Insert"){
			scanf("%d",&k);
			t.insert(k);
		}
		if(op=="Delete"){
			scanf("%d",&k);
			t.erase(k);
		}
		if(op=="Rotate"){
			scanf("%d",&k);
			t.reverse(k);
		}
		if(op=="Get"){
			char x=t.print(t.rt,t.pos+1);
			cout<<x;
			if(x!='\n') cout<<'\n';
		}
		if(op=="Prev") t.pre(); 
		if(op=="Next") t.nxt(); 
	}
	return 0;
}
2023/8/21 21:00
加载中...