社区讨论

帮忙问一下

P3377【模板】可并堆 1参与者 227已保存回复 297

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
294 条
当前快照
1 份
快照标识符
@ltr5oztp
此快照首次捕获于
2024/03/14 19:38
2 年前
此快照最后确认于
2026/01/04 17:04
2 个月前
查看原帖
有个小朋友问我为什么他会TLE #14。但是本人老了,不知道怎么为他优化。故而想求助各位大佬。
CPP
#include<bits/stdc++.h>
using namespace std;
int n,m;
struct node{
	int id,v;
	bool operator<(node x)const{
		return v==x.v?id<x.id:v<x.v;
	}
}v[100009];
int d[100009],ls[100009],rs[100009],rt[100009],vis[100009];
int rd(){
    int out = 0,flag = 1;char c = getchar();
    while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
    while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
    return flag * out;
    }
int find(int x){
	return rt[x]==x?x:rt[x]=find(rt[x]);
}
int merge(int x,int y){
	if(!x||!y){
		return x+y;
	}
	if(v[y]<v[x]){
		swap(x,y);
	}
	rs[x]=merge(rs[x],y);
	if(d[ls[x]]<d[ls[y]]){
		swap(ls[x],ls[y]);
	}
	d[x]=d[ls[x]]+1;
	return x;
}
int main(){
	d[0]=-1;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&v[i].v);
		rt[i]=i;
		v[i].id=i;
	}
	int op,a,b;
	while(m--){
		op=rd(),a=rd();
		if(op==1){
			b=rd();
			if(vis[a]||vis[b]){
				continue;
			}
			a=find(a);
			b=find(b);
			if(a!=b){
				rt[a]=rt[b]=merge(a,b);
			}
		}
		if(op==2){
			if(vis[a]){
				printf("-1\n");
				continue;
			}
			a=find(a);
			vis[a]=1;
			printf("%d\n",v[a].v);
			rt[ls[a]]=rt[rs[a]]=rt[a]=merge(ls[a],rs[a]);
		//	ls[a]=ls[a]=d[a]=0;
		}
	}
	return 0;
}

回复

297 条回复,欢迎继续交流。

正在加载回复...