题解:P15057 [UOI 2023 II Stage] Roads of Potokolandiya
不要推数学规律了,直接上并查集得了。
题解
题目等价于一个
那我们直接用并查集维护,然后统计
题目还要求输出两个属于不同连通块的点,那我们记录两个然后输出。
代码
#include<iostream>
using namespace std;
int n,x,y,f[1000001];
int find(int x){
return (f[x]==x)?x:(f[x]=find(f[x]));
}
int main(){
cin>>n;
for(int i=n;i;i--)f[i]=i;
for(int i=n;i;i--)f[find(i)]=find((i+i>n)?(i+i-n):(i+i));
for(int i=n;i;i--)
if(f[i]==i)x?(y=i):(x=i);
if(y)cout<<"NO\n"<<x<<' '<<y;
else cout<<"YES";
}