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