好题一道
题意:所有的k长度的字段的公共最小值,没有最小值输出-1,k从1到n。
解法:最朴素的做法是n^2,换一种思路,两个相同数之间的距离的最大值不就是我们要找的k吗,不要忘记第一个数和最后一个数是找和最前面和最后面的距离。用这种方法直接找k。
#include<bits/stdc++.h>
#define ll long long
#define ios ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);
using namespace std;
const int maxn=3e5+5,INF=0x3f3f3f3f;
int ans[maxn];
vector<int>v[maxn];
int main()
{
ios;
int t;
cin>>t;
while(t--)
{
memset(ans,INF,sizeof(ans));
int n;
cin>>n;
for(int i=1;i<=n;i++)
v[i].clear();
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
v[x].push_back(i);
}
for(int i=1;i<=n;i++)
{
if(!v[i].empty())
{
int mx=0;
for(int j=1;j<v[i].size();j++)
{
mx=max(mx,v[i][j]-v[i][j-1]);
}
mx=max(mx,v[i].front());
mx=max(mx,n-v[i].back()+1);
//cout<<i<<" "<<mx<<endl;
ans[mx]=min(ans[mx],i);
}
}
for(int i=2 ;i<=n;i++)
ans[i]=min(ans[i],ans[i-1]);
for(int i=1;i<=n;i++)
if(ans[i]==INF)
cout<<-1<<" ";
else cout<<ans[i]<<" ";
cout<<endl;
}
return 0;
}