社区讨论

奇怪的现象....

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

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@m1uymelu
此快照首次捕获于
2024/10/05 00:48
去年
此快照最后确认于
2025/11/04 18:03
4 个月前
查看原帖
发现当代码如下时,除了最后一个点会tle,其他点都可以过,但是这个写法显然是错误的:
CPP
#include <iostream>
#define MAXN 100005

using namespace std;

inline int read(){
	int x=0,k=1;
	char temp=0;
	while(temp>'9'||temp<'0'){if(temp=='-')k=-1;temp=getchar();}
	while(temp<='9'&&temp>='0'){x=x*10+(temp-'0');temp=getchar();}
	return x*k;
}

inline void wrt(int x){
	if(x<0){putchar('-');wrt(-1*x);return;}
	if(x/10)wrt(x/10);
	putchar(x%10+'0');
}

int v[MAXN],lc[MAXN],rc[MAXN],dis[MAXN],fa[MAXN];

int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}

int merge(int x,int y){
	if(!x||!y) return x+y;
	if(v[x]==v[y]?x>y:v[x]>v[y])swap(x,y);
	rc[x]=merge(rc[x],y);
	if(dis[lc[x]]<dis[rc[y]])swap(lc[x],rc[x]);//这里本来是if(dis[lc[x]]<dis[rc[x]])swap(lc[x],rc[x])
	dis[x]=dis[rc[x]]+1;
	return x;
}

int n=0,m=0,opt=0,x=0,y=0;

int main(){
	n=read(),m=read();
	for(int i=1;i<=n;i++){v[i]=read();fa[i]=i;}
	dis[0]=-1;
	while(m--){
		opt=read(),x=read();
		if(opt==1){
			y=read();
			if(v[x]==-1||v[y]==-1)continue;
			x=find(x);y=find(y);
			if(x!=y)fa[x]=fa[y]=merge(x,y);
		}else{
			if(v[x]==-1){wrt(-1);putchar('\n');continue;}
			x=find(x);
			wrt(v[x]);putchar('\n');
			v[x]=-1;
			fa[lc[x]]=fa[rc[x]]=fa[x]=merge(lc[x],rc[x]);
		}
	}
}

回复

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

正在加载回复...