题意
给你一个数组,对于一个数k,求在该数组所有大小为k的子数组中都出现的最小数字,k从1~n
思路
看到ai 数据范围1~n,考虑对于每个数字,计算他能满足最小的k为多少,然后做一个最小前缀和。
能满足的最小k就是该数字相互之间距离的最大值,记得加上开头0和结尾n+1。
代码
int a[MX],mx[MX];//相互之间的距离最大值
void solve()
{
int n;cin>>n;
map<int,int>mp;
rpp(i,n) mp[i]=0,mx[i]=1;
rpp(i,n)
{
int x;cin>>x;
mx[x]=max(mx[x],i-mp[x]);
mp[x]=i;
}
rpp(i,n) mx[i]=max(mx[i],n+1-mp[i]);
map<int,int>ans;
rpp(i,n) if(ans[mx[i]]==0) ans[mx[i]]=i;
rpp(i,n) if(i!=1) if(ans[i-1]) ans[i]=ans[i]==0?ans[i-1]:min(ans[i],ans[i-1]);
rpp(i,n) cout<<(ans[i]==0?-1:ans[i])<<" ";
cout<<endl;
}