fhq-treap 爆零求助
查看原帖
fhq-treap 爆零求助
555950
wdgm4楼主2023/7/19 15:22

TLE on #2,#3,其余全 WA。QWQ

#include<bits/stdc++.h>
#define XD 114514
#define MAXN 10000010
using namespace std;
int n,m;
struct tree{
	int l,r,siz,dis;
	char ch;
} t[MAXN];
int cnt,root;
int create(char ch){
	cnt++;
	t[cnt].siz=1;
	t[cnt].dis=rand();
	t[cnt].ch=ch;
	return cnt;
}
void split(int rt,int k,int &x,int &y){
	if(!rt){
		x=0;y=0;
		return;
	}
	if(t[t[rt].l].siz+1<=k){
		x=rt;
		split(t[rt].r,k-t[t[rt].l].siz-1,t[rt].r,y);
	}else if(t[t[rt].l].siz>=k){
		y=rt;
		split(t[rt].l,k,x,t[rt].l);
	}
	t[rt].siz=t[t[rt].l].siz+t[t[rt].r].siz+1;
}
int merge(int x,int y){
	if(x==0 or y==0) return x|y;
	if(t[x].dis>t[y].dis){
		t[x].r=merge(t[x].r,y);
		t[x].siz=t[t[x].l].siz+t[t[x].r].siz+1;
		return x;
	}else{
		t[y].l=merge(x,t[y].l);
		t[y].siz=t[t[y].l].siz+t[t[y].r].siz+1;
		return y;
	}
}
void insert(int k){
	int x,y;char ch;
	split(root,m,x,y);
	while(k--){
		ch=getchar();
		while(ch<32 or ch>126 or ch=='\n') ch=getchar();
		x=merge(x,create(ch));
	}
	root=merge(x,y);
}
void del(int k){
	int x,y,z;
	split(root,m,x,z);
	split(z,k,y,z);
	root=merge(x,z);
}
void dfs(int x){
	if(!x) return;
	if(t[x].l) dfs(t[x].l);
	cout<<t[x].ch;
	if(t[x].r) dfs(t[x].r);
}
void get(int k){
	int x,y,z;
	split(root,m,x,z);
	split(z,k,y,z);
	dfs(y);
	root=merge(merge(x,y),z);
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	srand(time(0)^114+514&1919-810);
	cin>>n;
	while(n--){
		string s;cin>>s;
		if(s[0]=='M'){
			int k;cin>>k;
			m=k;
		}else if(s[0]=='I'){
			int x;cin>>x;
			insert(x);
		}else if(s[0]=='D'){
			int x;cin>>x;
			del(x);
		}else if(s[0]=='G'){
			int x;cin>>x;
			get(x);
			cout<<"\n";
		}else if(s[0]=='P') m--;
		else if(s[0]=='N') m++;
	}
	return 0;
}

样例过了。

本没有看出来哪里有错。QWQ

2023/7/19 15:22
加载中...