​Link​

考虑到什么样的数会在所有大小为 k k k的区间中出现

显然,设这个数字为 x x x,相邻两个 x x x的间隔必须小于等于 k k k(为了方便,我们令 a 0 = a n + 1 = x a_0=a_{n+1}=x a0​=an+1​=x)

显然这是充分必要条件.

必要性:若存在相邻 x x x的间隔大于 k k k,那么 x x x不在这个间隔里长 k k k的区间中出现

充分性:考虑第 i i i个 x x x的位置在 p o s i pos_i posi​,那么在区间右端点落在 [ p o s i , p o s i + k − 1 ] [pos_i,pos_i+k-1] [posi​,posi​+k−1]都包含第 i i i个 x x x

而第 i + 1 i+1 i+1个 x x x是小于等于 p o s i + k − 1 pos_i+k-1 posi​+k−1的,所以区间右端点落在 [ p o s i + 1 , p o s i + 1 + k − 1 ] [pos_{i+1},pos_{i+1}+k-1] [posi+1​,posi+1​+k−1]包含第 i + 1 i+1 i+1个 x x x

…以此类推,这些区间彼此相交,覆盖了整个 [ k , n ] [k,n] [k,n]



而且如果这个数字在所有大小为 k k k的区间出现过,那么一定也在所有大小为 k + 1 k+1 k+1的区间出现过

这就简单了,我们枚举 x x x,找到相邻 x x x出现的最小间隔为 z z z

显然当 k ∈ [ z , n ] k\in[z,n] k∈[z,n]时, x x x在每个区间都出现过

然后取个前缀 m i n min min就好了

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int inf = 1e9;
const int maxn = 3e5+10;
int n,t,a[maxn],mx[maxn];
vector<int>vec[maxn];
signed main()
{
cin >> t;
while( t-- )
{
cin >> n;
for(int i=1;i<=n;i++) vec[i].push_back( 0 ), mx[i] = -1;
for(int i=1;i<=n;i++) cin >> a[i], vec[a[i]].push_back( i );
for(int i=1;i<=n;i++) vec[i].push_back( n+1 );
for(int i=1;i<=n;i++)
{
int x = 0;
for(int j=1;j<vec[i].size();j++)
x = max( x,vec[i][j]-vec[i][j-1] );
if( mx[x]==-1 ) mx[x] = i;
else mx[x] = min( mx[x],i );
}
for(int i=2;i<=n;i++)
{
if( mx[i]==-1 ) mx[i] = mx[i-1];
else if( mx[i-1]!=-1 ) mx[i] = min( mx[i],mx[i-1] );
}
for(int i=1;i<=n;i++) cout << mx[i] << " ";
cout << endl;
for(int i=1;i<=n;i++) vec[i].clear();
}
}