社区讨论
奇怪的现象....
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 条回复,欢迎继续交流。
正在加载回复...