题解:P14002 [eJOI 2025] Navigation
题目链接
P14002 [eJOI 2025] Navigation
解题思路
先考虑树怎么做,容易想到我们可以令
考虑这个东西为什么会爆?发现环的时候会有以下情况:
dfs 到这里时,如果形成以下路径就倒闭了!
此时右下角这个节点就遍历不到了,因此这种情况下我们会挂掉。
那么比较显然,我们要用到颜色
感受一下,注意到我们此时的路径都在这个环内,因此邻域一定只有
当然我们这里有一个前提是存在一个入环点,考虑起点在环上的情况咋办。注意到起点在环上时,类似树的情况,我们可能会进入别的环,进入环时我们的算法就是对的,且由于我们遍历到第一次时,点的颜色类型为
分析一下次数,考虑到环的长度至少为
std::pair<int, int> navigate(int x, std::vector<int> v)
{
ll S=0,nw=0,c[4]={0,0,0,0},to[4]={-1,-1,-1,-1};
forl(i,0,(ll)v.size()-1)
c[v[i]]++,
to[v[i]]=i;
if(c[3])
{
if(c[1]>=2)
return {1,to[3]};
if(c[1]==0)
exit(-1);
return {0,to[3]};
}
if(c[0])
{
if(x==3)
return {2,to[0]};
return {1,to[0]};
}
if(c[1]==1)
return {2,to[1]};
if(c[1]==2)
{
if(x<=1)
return {3,to[1]};
if(x==3)
forl(i,0,(ll)v.size()-1)
if(v[i]==1)
return {2,i};
}
return {-1,-1};
}