求助fhq-treap MLE
查看原帖
求助fhq-treap MLE
468657
lsj2009Isj2OO9楼主2022/10/22 15:58

rt.

评测记录->https://www.luogu.com.cn/record/90990213

有 WA 是可以理解的,但是 MLE 就很奇怪。算了下空间,也就十几 MB,完全不可能 MLE。求助各位大佬 qwq。

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define INFLL 0x3f3f3f3f3f3f3f3f
//#define int long long
#define PII pair<int,int>
#define rep(k,l,r) for(int k=l;k<=r;++k)
#define per(k,r,l) for(int k=r;k>=l;--k)
#define cl(f,x) memset(f,x,sizeof(f))
using namespace std;
const int N=1e5+5;
mt19937 rd(time(0));
struct node {
	int val,x,siz,l,r;
}; node tree[N];
int tot,root;
int add_node(int val) {
	tree[++tot]={val,(int)rd(),1,0,0}; return tot;
}
void push_up(int k) {
	tree[k].siz=tree[tree[k].l].siz+tree[tree[k].r].siz+1;
}
void split(int k,int val,int &u,int &v) {
	if(!k) {
		u=v=0; return;
	}
	if(tree[k].val<=val)
		u=k,split(tree[k].r,val,tree[k].r,v);
	else
		v=k,split(tree[k].l,val,u,tree[k].l);
	push_up(k);
}
int merge(int u,int v) {
	if(!u||!v)
		return u|v;
	if(tree[u].x<tree[v].x) {
		tree[u].r=merge(tree[u].r,v);
		push_up(u);
		return u;
	} else {
		tree[v].l=merge(u,tree[v].l);
		push_up(v);
		return v;
	}
}
void ins(int val) {
	int u=0,v=0;
	split(root,val,u,v);
	root=merge(merge(u,add_node(val)),v);
}
void del(int val) {
	int u=0,v=0,w=0;
	split(root,val,u,v);
	split(u,val-1,u,w);
	w=merge(tree[w].l,tree[w].r);
	root=merge(v,merge(u,w));
}
int query_val(int k,int rk) {
	if(rk<=tree[tree[k].l].siz)
		return query_val(tree[k].l,rk);
	else if(tree[tree[k].l].siz+1==rk)
		return tree[k].val;
	else
		return query_val(tree[k].r,rk-tree[tree[k].l].siz-1);
}
int query_rk(int val) {
	int u=0,v=0;
	split(root,val-1,u,v);
	int res=tree[u].siz+1;
	root=merge(u,v);
	return res;
}
int query_pre(int val) {
	int u=0,v=0;
	split(root,val-1,u,v);
	int res=query_val(u,tree[u].siz);
	root=merge(u,v);
	return res;
}
int query_nxt(int val) {
	int u=0,v=0;
	split(root,val,u,v);
	int res=query_val(v,1);
	root=merge(u,v);
	return res;
}
signed main() {
	int q;
	scanf("%d",&q);
	rep(_,1,q) {
		int op,val;
		scanf("%d%d",&op,&val);
		if(op==1)
			ins(val);
		else if(op==2)
			del(val);
		else if(op==3)
			printf("%d\n",query_rk(val));
		else if(op==4)
			printf("%d\n",query_val(root,val));
		else if(op==5)
			printf("%d\n",query_pre(val));
		else if(op==6)
			printf("%d\n",query_nxt(val));
	}
	return 0;
}
2022/10/22 15:58
加载中...