[NOI2002]银河英雄传说
Posted $mathcal{color{skyblue}{\_Orch
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[NOI2002]银河英雄传说相关的知识,希望对你有一定的参考价值。
我还是太弱了\(qnq\).
稍微总结一下吧:维护前缀和,查询的时候做差,中途\(Merge\)的时候我们只需要改当前父指针即可,在每次\(find\)的时候更新\(sum\)数组即可。
\(wx\)大佬给的思路,我的垃圾思路只有\(12\)分
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int f[30010],sum[30010],tot[30010];
int find(int x)
{
if(f[x]==x)return x;
int p1=f[x],p2=sum[x];
f[x]=find(f[x]);
if(p1!=f[x])sum[x]=p2+sum[p1];
return f[x];
}
int main()
{
cin.sync_with_stdio(false);
for(int i=1;i<=30010;i++)
{
f[i]=i;
sum[i]=1;
tot[i]=1;
}
int t;
cin>>t;
char in;
int a,b;
for(int i=1;i<=t;i++)
{
cin>>in>>a>>b;
int f1=find(a),f2=find(b);
if(in==‘M‘)
{
f[f1]=f2;
sum[f1]=tot[f2];
tot[f2]+=tot[f1];
}
if(in==‘C‘)
{
if(f1==f2)
{
int p1=sum[a],p2=sum[b];
if(a==f1)p1=0;
if(b==f2)p2=0;
printf("%d\n",max(p1-p2,p2-p1)-1);
continue;
}
printf("-1\n");
}
}
}
以上是关于[NOI2002]银河英雄传说的主要内容,如果未能解决你的问题,请参考以下文章