题目链接
题目大意:
定义 一个序列的 k 数 为 出现在序列所有长度为 k 的子区间内的最小数,如没有数出现在所有长度为 k 的子区间内,则 k 数为 −1。给出一个序列,求出对于 k∈[1,n] 的每一个 k 数
代码如下:
#include<iostream>
#include<vector>
using namespace std;
const int maxn=3e5+10;
const int inf=0x3f3f3f3f;
int a[maxn];
vector<int> v[maxn];
int main()
{
int t,i,j,k,x,y;
int maxx;
int n;
cin>>t;
while(t--)
{
cin>>n;
for(i=1;i<=n;i++)
{
v[i].clear();
a[i]=inf;
}
for(i=1;i<=n;i++)
{
cin>>x;
v[x].push_back(i);//记录下相同数字的位置
}
for(i=1;i<=n;i++)
{
if(v[i].empty())
continue;
maxx=0;
for(j=1;j<v[i].size();j++)
maxx=max(maxx,v[i][j]-v[i][j-1]);//找到相同数字位置的最大间距
//最大间距就是那个数的最小滑窗长度
maxx=max(maxx,v[i].front());//别忘了首
maxx=max(maxx,n-v[i].back()+1);//别忘了尾
a[maxx]=min(a[maxx],i);//当多个数的最大间距一样时
// 选择最小的那个数 符合题意
}
for(i=2;i<=n;i++)
a[i]=min(a[i],a[i-1]);//大滑窗一定包含小滑窗 所以不断更新更小的数
// 符合题意
for(i=1;i<n;i++)
{
if(a[i]!=inf)
cout<<a[i]<<" ";
else
cout<<"-1 ";
}
if(a[n]!=inf)
cout<<a[i]<<endl;
else
cout<<"-1"<<endl;
}
return 0;
}