社区讨论

奇葩!!!

P1196[NOI2002] 银河英雄传说参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mi7rqa6t
此快照首次捕获于
2025/11/21 02:32
4 个月前
此快照最后确认于
2025/11/21 02:32
4 个月前
查看原帖
AC代码
CPP
#include<bits/stdc++.h>
#define rt register int
#define M 300010
using namespace std;
int T,x,y,xx,yy,s[M],k[M],f[M];char c[2];
inline int find(rt z)
{
    if(f[z]==z)return f[z];
    rt xx=find(f[z]);  //此处
    s[z]+=s[f[z]];
    return f[z]=xx;   //此处
}
int main()
{
	scanf("%d",&T);
	for(rt i=1;i<=M;++i) f[i]=i,k[i]=1;
	for(rt i=1;i<=T;++i)
	{
		scanf("%s%d%d",c,&x,&y);
		xx=find(x),yy=find(y);
		if(c[0]=='M')
		{
			f[xx]=yy;
			s[xx]+=k[yy];
            k[yy]+=k[xx],k[xx]=0;
		}
		if(c[0]=='C')
		  if(xx!=yy) printf("-1\n");
		  else printf("%d\n",abs(s[x]-s[y])-1);
	}return 0;
}
12分代码
CPP
#include<bits/stdc++.h>
#define rt register int
#define M 300010
using namespace std;
int T,x,y,xx,yy,s[M],k[M],f[M];char c[2];
inline int find(rt z)
{
    if(f[z]==z)return f[z];
    s[z]+=s[f[z]];
    return f[z]=find(f[z]); //此处
}
int main()
{
    scanf("%d",&T);
    for(rt i=1;i<=M;++i) f[i]=i,k[i]=1;
    for(rt i=1;i<=T;++i)
    {
        scanf("%s%d%d",c,&x,&y);
        xx=find(x),yy=find(y);
        if(c[0]=='M')
        {
            f[xx]=yy;
            s[xx]+=k[yy];
            k[yy]+=k[xx],k[xx]=0;
        }
        if(c[0]=='C')
          if(xx!=yy) printf("-1\n");
          else printf("%d\n",abs(s[x]-s[y])-1);
    }return 0;
}
为什么那里有这么大的区别啊? 好像没什么区别啊

回复

1 条回复,欢迎继续交流。

正在加载回复...