题意:
保证所有数据中,序列总和不超过3e5。
解法:
令ma[x]表示序列中所有a[i]=x的距离最大值,这个O(n)预处理.
如果ma[x]<=k,那么说明所有长度为k的区间都有x.
对于[1,n]中的每个k,ans[k]=满足ma[x]<=k的x的最小值.
因此我们对(x,ma[x])从小到大排序,
枚举k的同时维护ma[x]<=k的最小值即可.
code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxm=3e5+5;
int ans[maxm];
int pos[maxm];
int ma[maxm];
int id[maxm];
int a[maxm];
int n;
bool cmp(int a,int b){
return ma[a]<ma[b];
}
void solve(){
cin>>n;
for(int i=1;i<=n;i++){
pos[i]=0,ma[i]=-1;
}
for(int i=1;i<=n;i++){
cin>>a[i];
ma[a[i]]=max(ma[a[i]],i-pos[a[i]]);
pos[a[i]]=i;
}
for(int i=1;i<=n;i++){
ma[i]=max(ma[i],n+1-pos[i]);
}
for(int i=1;i<=n;i++){
id[i]=i;
}
sort(id+1,id+1+n,cmp);
int j=1;
int mi=1e9;
for(int i=1;i<=n;i++){
while(j<=n&&ma[id[j]]<=i){
if(ma[id[j]]!=-1){
mi=min(mi,id[j]);
}
j++;
}
ans[i]=mi;
if(ans[i]==1e9)ans[i]=-1;
}
for(int i=1;i<=n;i++){
cout<<ans[i]<<' ';
}
cout<<endl;
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);
int T;cin>>T;
while(T--){
solve();
}
return 0;
}