题目大意:有一个长度为n的数组a,定义k-amazing为a中每个长度为k的子串都有的数字中最小的。要求输出k=1,2...n时的k-amazing。
思路:对每个数字求最长间距cal 则k>=cal时表示k-amazing条件成立 注意应该对一个数字中第一次出现的位置和最后一次出现的位置特判
1 #include<bits/stdc++.h> 2 #define fi first 3 #define se second 4 #define pb(i) push_back(i) 5 #define rep(i,a,b) for(int i=a;i<=b;i++) 6 #define per(i,a,b) for(int i=b;i>=a;i--) 7 #define mem(a,b) memset(a,b,sizeof(a)) 8 #define VI vector<int> 9 #define VLL vector<ll> 10 #define MPII map<pair<int,int>,int> 11 #define mp make_pair 12 #define PQI priority_queue<int> 13 using namespace std; 14 typedef long long ll; 15 typedef unsigned long long ull; 16 const int N = 3e5+10; 17 const int INF = 0x3f3f3f3f; 18 const int inf = - INF; 19 const int mod = 1e9+7; 20 const double pi = acos(-1.0); 21 const double eps=1e-5; 22 int n; 23 vector<int>v[N]; 24 int ans[N]; 25 int main(){ 26 int T,x; 27 scanf("%d",&T); 28 while(T--){ 29 scanf("%d",&n); 30 rep(i,0,n) ans[i]=INF,v[i].clear(); 31 rep(i,1,n){ 32 scanf("%d",&x); 33 v[x].push_back(i); 34 } 35 rep(i,1,n){ 36 if(v[i].empty())continue; 37 int dis=0; 38 for(int j=1;j<v[i].size();j++) 39 dis=max(dis,v[i][j]-v[i][j-1]); 40 dis=max(dis,max(v[i].front(),n-v[i].back()+1)); 41 ans[dis]=min(ans[dis],i); 42 } 43 rep(i,2,n) ans[i]=min(ans[i],ans[i-1]); 44 rep(i,1,n){ 45 if(ans[i]==INF) printf("-1 "); 46 else printf("%d ",ans[i]); 47 } 48 printf(" "); 49 /* 50 rep(k,1,n){ 51 int flag=-1; 52 rep(i,1,n){ 53 if(k>=cal[i]){ 54 flag=i; 55 break; 56 } 57 } 58 printf("%d%c",flag,k==n?' ':' '); 59 }*/ 60 } 61 system("pause"); 62 return 0; 63 }