C. k-Amazing Numbers(枚举)


思路:维护相同的数出现的最大位置差。

然后从贪心地从小到大枚举填答案。

时间复杂度: O ( n ) O(n) O(n)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3e5+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair<int,int>
#define fi first
#define se second
#define pb push_back
#define il inline
int t,n;
int a[N],d[N],last[N],ans[N];
int main(){
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		for(int i=1;i<=n;i++){
			scanf("%d",&a[i]);
			last[i]=d[i]=0,ans[i]=-1;
		}
		for(int i=1;i<=n;i++){
			int x=a[i];
			d[x]=max(d[x],i-last[x]);
			last[x]=i;
		}
		for(int i=1;i<=n;i++){
			d[i]=max(d[i],n-last[i]+1);
			for(int j=d[i];j<=n&&ans[j]==-1;j++) ans[j]=i;
		}
		for(int i=1;i<=n;i++) printf("%d ",ans[i]);
		printf("\n"); 
	}
	return 0;
}

C. k-Amazing Numbers(枚举)_#include