神秘的RE和WA,求列文虎克调!(人均列文虎克)
查看原帖
神秘的RE和WA,求列文虎克调!(人均列文虎克)
658786
STUDENT00楼主2023/1/13 22:12

现场悲剧: https://www.luogu.com.cn/record/99676150

悲剧代码:

#include<bits/stdc++.h>
#define N 10005
using namespace std;
int n,m,q,fa[N],f[N][15],mins[N][15],h[N],lg[N];
vector<pair<int,int> > g[N];
struct Line{
	int x,y,z;
	bool friend operator<(const Line a,const Line b){
		return a.z>b.z;
	}
} ls[N];
int find(int x){
	if(fa[x]==x) return x;
	return fa[x]=find(fa[x]);
}
void krushal(){
	int tot=0;
	for(int i=1;tot<n&&i<=m;i++){
		int x=find(ls[i].x),y=find(ls[i].y);
		if(x!=y){g[ls[i].x].push_back(make_pair(ls[i].y,ls[i].z));g[ls[i].y].push_back(make_pair(ls[i].x,ls[i].z));fa[x]=y;tot++;}
	}
}
void build(int now,int fa){
	h[now]=h[fa]+1;
	for(int i=0;i<g[now].size();i++){
		int t=g[now][i].first,s=g[now][i].second;
		if(t==fa) continue;f[t][0]=now;mins[t][0]=s;
		build(t,now);
	}
}
void init(){
	for(int j=1;(1<<j)<=n;j++){
		for(int i=1;i<=n;i++) f[i][j]=f[f[i][j-1]][j-1],mins[i][j]=min(mins[i][j-1],mins[f[i][j-1]][j-1]);
	}
}
int lca(int x,int y){
	int ans=1e9;
	if(h[x]<h[y]) swap(x,y);
	while(h[x]>h[y]) ans=min(ans,mins[x][lg[h[x]-h[y]]]),x=f[x][lg[h[x]-h[y]]];
	if(x==y) return ans;
	for(int i=lg[h[x]];i>=0;i--){
		if(f[x][i]!=f[y][i]) ans=min(ans,mins[x][i]),ans=min(ans,mins[y][i]),x=f[x][i],y=f[y][i];
	}
	ans=min(ans,mins[x][0]);ans=min(ans,mins[y][0]);
	return ans;
}
int main(){
	scanf("%d%d",&n,&m);
	lg[0]=-1;for(int i=1;i<=n;i++) lg[i]=lg[i>>1]+1;
	for(int i=1;i<=n;i++) fa[i]=i;
	for(int i=1;i<=m;i++) scanf("%d%d%d",&ls[i].x,&ls[i].y,&ls[i].z);
	sort(ls+1,ls+m+1);
	krushal();
	build(1,0);
	init();
	scanf("%d",&q);
	while(q--){
		int x,y;scanf("%d%d",&x,&y);
		if(fa[x]!=fa[y]) printf("-1\n");
		else printf("%d\n",lca(x,y));
	}
	return 0;
}
2023/1/13 22:12
加载中...