蒟蒻85分RE求助
查看原帖
蒟蒻85分RE求助
262934
惟有泪千行楼主2020/9/6 11:28

蒟蒻调这个题调了一上午,已经把数组开的很大了,但还是RE,求各位大佬看看QAQ

#include<bits/stdc++.h>
#define N 1000050
#define int long long
using namespace std;
int n,m,fa[N<<1],f[N<<1][100],lg[N<<1],weight[N<<1],vis[N<<1],ct=0,dep[N<<1],head[N<<1],cnt,q;
vector<int>v[N<<1];
inline int read(){
	int x=0,f=1;char ch=getchar();
	while(!isdigit(ch)&&ch!='-')ch=getchar();
	if(ch=='-')f=-1,ch=getchar();
	while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch-'0'),ch=getchar();
	return x*f;
}
struct Edge{
	int u,v,w,next;
	inline friend bool operator < (Edge x,Edge y){
		return x.w>y.w;
	}
}e1[N<<1];
inline void adde1(int u,int v,int w){
	e1[++cnt].u=u;
	e1[cnt].v=v;
	e1[cnt].w=w;
}
inline int find(int x){
	if(fa[x]==x)return x;
	return fa[x]=find(fa[x]);
}
void dfs(int x,int fl)
{
	f[x][0]=fl;
	for(int i=1;i<=lg[dep[x]];i++)
	{
		f[x][i]=f[f[x][i-1]][i-1];
	}
	for(int i=0;i<v[x].size();i++)
	{
		if(v[x][i]==fl) continue;
		dep[v[x][i]]=dep[x]+1;
		dfs(v[x][i],x);
	}
}
int LCA(int x,int y)
{
	if(dep[x]<dep[y]) swap(x,y);
	while(dep[x]>dep[y]) x=f[x][lg[dep[x]-dep[y]]-1];
	if(x==y) return x;
	for(int i=lg[dep[x]]-1;i>=0;i--) 
	{
		if(f[x][i]==f[y][i]) continue;
		x=f[x][i];y=f[y][i];
	}
	return f[x][0];
}
inline void init(){
	for(register int i=1;i<=(N<<1)-9;++i){
		lg[i]=lg[i-1]+(1<<lg[i-1]==i);
	}
	for(register int i=1;i<=n<<1;++i){
		fa[i]=i;
	}
}
signed main(){
	scanf("%lld%lld",&n,&m);
	init();
	for(register int i=1;i<=m;++i){
		int x=read(),y=read(),z=read();
		adde1(x,y,z);
	}
	sort(e1+1,e1+m+1);
	cnt=1;
	for(register int i=1;i<n;++i){
		while(find(e1[cnt].u)==find(e1[cnt].v))++cnt;
		if(cnt>m)break;
//		printf("%d\n",cnt);
		v[n+i].push_back(fa[e1[cnt].u]);
		v[n+i].push_back(fa[e1[cnt].v]);
		v[fa[e1[cnt].u]].push_back(n+i);
		v[fa[e1[cnt].v]].push_back(n+i);
		fa[fa[e1[cnt].u]]=n+i;
		fa[fa[e1[cnt].v]]=n+i;
		weight[i+n]=e1[cnt].w;
	}
	weight[0]=-1;
	for(register int i=1;i<=n;++i){
		if(!vis[find(i)]){
			vis[fa[i]]=1;
			v[0].push_back(fa[i]);
			v[fa[i]].push_back(0);
		}
	}
	dfs(0,-1);
	scanf("%lld",&q);
	for(register int i=1;i<=q;++i){
		int x,y;
		scanf("%lld%lld",&x,&y);
		printf("%lld\n",weight[LCA(x,y)]);
	}
	return 0;
}

谢谢QAQ

2020/9/6 11:28
加载中...