求助,非旋Treap喜提RE 0分
查看原帖
求助,非旋Treap喜提RE 0分
83634
xh092113楼主2020/8/10 21:11

3次提交均RE,本机无问题,洛谷在线IDE亦无问题。

附不开O2、10倍空间版本代码:

#include<bits/stdc++.h>

using namespace std;

#define rg register
#define In inline
#define ll long long

const int N = 8e4;

namespace IO{
	In ll read(){
		ll s = 0,ww = 1;
		char ch = getchar();
		while(ch < '0' || ch > '9'){if(ch == '-')ww = -1;ch = getchar();}
		while('0' <= ch && ch <= '9'){s = 10 * s + ch - '0';ch = getchar();}
		return s * ww;
	}
	In void write(ll x){
		if(x < 0)putchar('-'),x = -x;
		if(x > 9)write(x / 10);
		putchar('0' + x % 10);
	}
}
using namespace IO;

int n,m;
int p[N+5];

struct FHQTreap{
	int cnt,rt;
	int lc[20*N+5],rc[20*N+5],fa[20*N+5],sz[20*N+5],pri[20*N+5];
void print(int u){
cout<<"u="<<u<<" lc[u]="<<lc[u]<<" rc[u]="<<rc[u]<<" fa[u]="<<fa[u]<<" sz[u]="<<sz[u]<<endl;
if(lc[u])print(lc[u]);
if(rc[u])print(rc[u]);
}	
	In int pushup(int u){
		sz[u] = sz[lc[u]] + sz[rc[u]] + 1;
	}
	int merge(int u,int v,int f){
		if(!u || !v){if(u + v)fa[u+v] = f;return u + v;}
		if(pri[u] > pri[v]){
			rc[u] = merge(rc[u],v,u);
			pushup(u);
			fa[u] = f;
			return u;
		}
		else{
			lc[v] = merge(u,lc[v],v);
			pushup(v);
			fa[v] = f;
			return v;
		}
	}
	void split(int u,int &v,int &w,int x,int fv,int fw){
		if(!u){v = w = 0;return;}
		else{
			if(sz[lc[u]] >= x){
				w = u;
				split(lc[u],v,lc[w],x,fv,w);
				fa[w] = fw;
				pushup(w);
			}
			else{
				v = u;
				split(rc[u],rc[v],w,x - sz[lc[u]] - 1,v,fw);
				fa[v] = fv;
				pushup(v);
			}
		}
	}
	void init(){
		rt = 0;
		cnt = n;
		for(rg int i = 1;i <= n;i++)pri[i] = 1ll * rand() * 19709 % (ll)1e9,sz[i] = 1;
		for(rg int i = 1;i <= n;i++)rt = merge(rt,p[i],0);
	}
	int kth(int u,int k){
		if(sz[lc[u]] >= k)return kth(lc[u],k);
		else if(sz[lc[u]] + 1 < k)return kth(rc[u],k - sz[lc[u]] - 1);
		else return u;
	}
	stack<int>S;
	int rank(int u){
		int ans = sz[lc[u]] + 1;
		int v = fa[u];
		while(v != 0){
			if(u == rc[v])ans += sz[lc[v]] + 1;
			u = v,v = fa[v];
		}
		return ans;
	}
	In void Top(int x){
		int k = rank(x);
//cout<<"x="<<x<<" k="<<k<<endl;
		int u,v,w;
		split(rt,u,v,k,0,0);
		split(u,u,w,k - 1,0,0);
		rt = merge(merge(w,u,0),v,0);
	}
	In void Bottom(int x){
		int k = rank(x);
		int u,v,w;
		split(rt,u,v,k,0,0);
		split(u,u,w,k - 1,0,0);
		rt = merge(merge(u,v,0),w,0);
	}
	In void Insert(int x,int t){
		if(t == 0)return;
		int k = rank(x);
		int u,v,w,y;
		split(rt,u,v,k,0,0);
		split(u,u,w,k - 1,0,0);
		if(t == -1){
			split(u,u,y,k - 2,0,0);
			rt = merge(merge(u,w,0),merge(y,v,0),0);	
		}
		else{
			split(v,y,v,1,0,0);
			rt = merge(merge(u,y,0),merge(w,v,0),0);
		}
	}
}T;

int main(){
//	freopen("p2596.in","r",stdin);
//	freopen("p2596.out","w",stdout);
	
//	srand((int)time(0));
	n = read(),m = read();
	for(rg int i = 1;i <= n;i++)p[i] = read();
	T.init();
//T.print(T.rt);
//cout<<T.lc[0]<<" "<<T.rc[0]<<" "<<T.fa[0]<<" "<<T.sz[0]<<" "<<T.pri[0]<<endl;
	for(rg int i = 1;i <= m;i++){
//cout<<"i="<<i<<endl;
		char ch = getchar();
		while(ch != 'T' && ch != 'B' && ch != 'I' && ch != 'A' && ch != 'Q')ch = getchar();
		char chh = getchar();
		while(chh != ' ')chh = getchar();
		if(ch == 'T'){
			int s = read();
			T.Top(s);
		}
		else if(ch == 'B'){
			int s = read();
			T.Bottom(s);
		}
		else if(ch == 'I'){
			int s = read(),t = read();
			T.Insert(s,t);
		}
		else if(ch == 'A'){
			int s = read();
			write(T.rank(s) - 1),putchar('\n');
		}
		else{
			int k = read();
			write(T.kth(T.rt,k)),putchar('\n');
		}
//T.print(T.rt);
//cout<<T.lc[0]<<" "<<T.rc[0]<<" "<<T.fa[0]<<" "<<T.sz[0]<<" "<<T.pri[0]<<endl;
	}
	
	return 0;
}
2020/8/10 21:11
加载中...