有一个序列 a1~an
初始时集合中只有一个元素 ai ,并有两个指针 l=r=i 。
每次可以选择如下两个操作之一,直到结束:
1.将l减一,然后检查集合中是否已有al。如果有,那么立即结束,否则往集合中插入al。
2.将r加一,然后检查集合中是否已有ar。如果有,那么立即结束,否则往集合中插入ar。
f(i)为能够结束的最小操作次数
给一个n 和一个序列a
n<=2e5
1<=a[i]<=1e9
保证序列有俩一样的数
#include<bits/stdc++.h>
using namespace std;
int n,a[200010],l,r,ans;
int dfs(int x,int y,bool flag)
{
if(flag==0)
{
if(x==1) return 1e9;
if(a[x]==a[x-1]) return y-x+1;
else return dfs(x-1,y,0);
}
else if(flag==1)
{
if(x==n) return 1e9;
if(a[x]==a[x+1]) return x-y+1;
else return dfs(x-1,y,1);
}
}
int main()
{
cin>>n;
for(int i=1;i<n;i++)
{
cin>>a[i];
}
for(int i=1;i<n;i++)
{
l=i,r=i;
cout<<min(dfs(i,i,0),dfs(i,i,1))<<" ";
}
return 0;
}