问个问题
  • 板块学术版
  • 楼主OldDriverTree
  • 当前回复5
  • 已保存回复6
  • 发布时间2024/4/20 22:02
  • 上次更新2024/4/20 22:37:07
查看原帖
问个问题
681036
OldDriverTree楼主2024/4/20 22:02

关于 G 题,这个代码为什么不对

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1;
vector<int> g[N];
int fa[N],depth[N];
int n,m;

int read() {
	int x=0; char c=0; while (!isdigit(c) ) c=getchar();
	while (isdigit(c) ) x=(x<<3)+(x<<1)+(c&15),c=getchar();
	return x;
}
void dfs(int u,int f) {
	fa[u]=f,depth[u]=depth[f]+1;
	for (int v:g[u]) if (v^f) dfs(v,u);
}
int dis(int x,int y)
{
	int a=depth[x],b=depth[y];
	while (depth[x]>depth[y]) x=fa[x];
	while (x^y) x=fa[x],y=fa[y];
	if (!x) return INT_MAX;
	return a+b-2*depth[x];
}
int main()
{
	n=read(),m=read();
	for (int i=1;i<=n;i++) depth[i]=1;
	int last=0;
	while (m--) {
		int a=read(),b=read(),c=read();
		a=1+(1ll*a*(1+last)%998244353)%2;
		b=1+(1ll*b*(1+last)%998244353)%n;
		c=1+(1ll*c*(1+last)%998244353)%n;
		if (a&1) g[b].push_back(c),g[c].push_back(b),dfs(b,0);
		else {
			if (depth[b]<depth[c]) swap(b,c);
			if (dis(b,c)>2) printf("%d\n",last=0);
			else printf("%d\n",last=fa[b]);
		}
	}
	return 0;
}
2024/4/20 22:02
加载中...