样例都没过求助!!1
查看原帖
样例都没过求助!!1
203008
YamadaRyou楼主2021/10/6 21:25

写的fhqtreap,稍微有点离谱,见谅/kk

#include<stdio.h>
inline int rand(){static int seed=2333;return seed=seed*5%999983;}
const int maxn=100001;
struct{int k,lc,rc,f,sz,v;long long sum;}node[maxn];
inline void pushup(int x){node[node[x].lc].f=x,node[node[x].rc].f=x;node[x].sz=node[node[x].lc].sz+node[node[x].rc].sz+1,node[x].sum=node[node[x].lc].sum+node[node[x].rc].sum+node[x].v;}
int merge(int a,int b){
	if(!a||!b)return 0;
	if(node[a].k>node[b].k)return merge(node[a].rc,b),pushup(a),a;
	else return merge(a,node[b].lc),pushup(b),b;
}
void split(int x){
	int y=x;
	for(;node[y].f&&node[node[y].f].lc==y;y=node[y].f);
	if(node[x].lc)node[node[x].lc].f=node[y].f;
	if(node[y].f)node[node[y].f].rc=node[x].lc;
	node[y].f=0,node[x].lc=0;
}
int findroot(int x){
	int y=x;
	for(;node[y].f;y=node[y].f);
	return y;
}
int nxt(int x){
	if(node[x].rc){int y=node[x].rc;for(;node[y].lc;y=node[y].lc);return y;}
	else{int y=x;for(;y&&node[node[y].f].rc==y;y=node[y].f);return node[y].f;}
}
int pre(int x){
	if(node[x].lc){int y=node[x].lc;for(;node[y].rc;y=node[y].rc);return y;}
	else{int y=x;for(;y&&node[node[y].f].lc==y;y=node[y].f);return node[y].f;}
}
int main(){
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i){
		node[i]={rand(),0,0,0,1};
		scanf("%d",&node[i].v);node[i].sum=node[i].x;
	}
	int x,y,z,a,b,c;
	for(;m--;){
		char c=(getchar(),getchar());
		switch(c){
			case 'M':scanf("%d%d",&x,&y);if(findroot(x)!=findroot(y))merge(findroot(x),findroot(y));break;
			case 'D':scanf("%d",&x);split(x);break;
			default:
				scanf("%d%d",&x,&y);
				if(findroot(x)!=findroot(y)){puts("-1");break;}
				y=nxt(y),z=pre(x);split(x);if(y)split(y);
				a=findroot(z),b=findroot(x),c=findroot(y);
				printf("%d\n",node[b].sum);
				merge(merge(a,b),c);
		}
	}
	return 0;
}

貌似是 merge 的问题,样例最后一行输出 -1/jk

2021/10/6 21:25
加载中...