百度之星——夏日漫步
作者:
Air1222
,
2024-05-22 14:26:28
,
所有人可见
,
阅读 5
//TEL,需要需处理op==2,减少重复计算
#include <iostream>
#include <queue>
using namespace std;
const int N = 2e5+10;
int n;
int c[N];
int dist[N];
bool st[N];
int get_p(int op,int t)
{
if(op==0) return t-1;
if(op==1) return t+1;
if(op==2)
{
for(int i=t+1;i<=n;i++)
if(c[t]==c[i])
return i;
}
return t;
}
void bfs()
{
queue<int>q;
dist[1]=0;
q.push(1);
st[1]=true;
while(q.size())
{
int t=q.front();
q.pop();
cout<<t<<endl;
for(int i=0;i<3;i++)
{
int a=get_p(i,t);
if(st[a]) continue;
if(a<1||a>n) continue;
st[a]=true;
dist[a]=dist[t]+1;
q.push(a);
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>c[i];
bfs();
cout<<dist[n];
return 0;
}
//AC
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
const int N = 2e5+10,M = 1e6+10;
int n;
int dist[N];
bool st[N];
vector<int>c[M];
int a[N];
int get_p(int op,int t)
{
if(op==2) return t-1;
if(op==1) return t+1;
if(op==0)
{
for(int i=0;i<c[a[t]].size()-1;i++)
if(c[a[t]][i]==t)
return c[a[t]][i + 1];
}
return t;
}
void bfs()
{
queue<int>q;
dist[1]=0;
q.push(1);
st[1]=true;
while(q.size())
{
int t=q.front();
q.pop();
for(int i=0;i<3;i++)
{
int a=get_p(i,t);
if(st[a]) continue;
if(a<1||a>n) continue;
st[a]=true;
dist[a]=dist[t]+1;
if(a==n) return;
q.push(a);
}
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
c[a[i]].push_back(i);//预处理
}
bfs();
printf("%d",dist[n]);
return 0;
}