题目:
还是对并查集的 rt 不太熟悉...
注意删去一个堆顶后把它的 fa (rt) 改成儿子合成的新堆顶,这样路径压缩也没有错了。
代码如下:
#include#include #include #include using namespace std;int const maxn=1e6+5;int n,m,fa[maxn],ls[maxn],rs[maxn],a[maxn],dis[maxn];bool vis[maxn];char c[5];int rd(){ int ret=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-')f=-1; ch=getchar();} while(ch>='0'&&ch<='9')ret=(ret<<3)+(ret<<1)+ch-'0',ch=getchar(); return ret*f;}int find(int x){ return fa[x]==x?x:fa[x]=find(fa[x]);}int merge(int x,int y){ if(!x||!y)return x+y; if(a[x]>a[y])swap(x,y); rs[x]=merge(rs[x],y); fa[rs[x]]=x; if(dis[ls[x]]