Codeforces Round #673 (Div. 2) C. k-Amazing Numbers
一开始甚至都没看懂题 直到看了大佬的翻译才明白。
题目地址
题目大意:给定一个数组,求出这个数组的所有长度为i的子串的公共最小值,如果没有则输出-1.
暴力是不可能暴力的,具体思路为遍历所有相同的数之间的距离,即为当i为多少时这个数会成为公共值,再从这些值中找到最小值,若之前没找到重复值输出-1即可。
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
const int maxn = 3e5+7;
int a[maxn],b[maxn],c[maxn],d[maxn];
int main()
{
IOS;
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
memset(d,0,sizeof(d));
for(int i=1;i<=n;i++)
{
cin>>a[i];
c[a[i]]=max(c[a[i]],i-b[a[i]]);
b[a[i]]=i;
}
for(int i=1;i<=n;i++)
{
c[a[i]]=max(n-b[a[i]]+1,c[a[i]]);
}
for(int i=1;i<=n;i++)
{
if(d[c[i]]==0)
{
d[c[i]]=i;
}
else
{
d[c[i]]=min(i,d[c[i]]);
}
}
int ans=-1;
for(int i=1;i<=n;i++)
{
if(d[i]==0&&ans==-1)
{
cout<<ans<<" ";
}
else if(ans==-1)
{
ans=d[i];
cout<<ans<<" ";
}
else if(d[i]==0)
{
cout<<ans<<" ";
}
else
{
ans=min(ans,d[i]);
cout<<ans<<" ";
}
}
cout<<endl;
}
return 0;
}