好题一道 题意:所有的k长度的字段的公共最小值,没有最小值输出-1,k从1到n。 解法:最朴素的做法是n^2,换一种思路,两个相同数之间的距离的最大值不就是我们要找的k吗,不要忘记第一个数和最后一个数是找和最前面和最后面的距离。用这种方法直接找k。
#include<bits/stdc++.h> #define ll long long #define ios ios::sync_with_stdio(false);cin.tie(0); cout.tie(0); using namespace std; const int maxn=3e5+5,INF=0x3f3f3f3f; int ans[maxn]; vector<int>v[maxn]; int main() { ios; int t; cin>>t; while(t--) { memset(ans,INF,sizeof(ans)); int n; cin>>n; for(int i=1;i<=n;i++) v[i].clear(); for(int i=1;i<=n;i++) { int x; cin>>x; v[x].push_back(i); } for(int i=1;i<=n;i++) { if(!v[i].empty()) { int mx=0; for(int j=1;j<v[i].size();j++) { mx=max(mx,v[i][j]-v[i][j-1]); } mx=max(mx,v[i].front()); mx=max(mx,n-v[i].back()+1); //cout<<i<<" "<<mx<<endl; ans[mx]=min(ans[mx],i); } } for(int i=2 ;i<=n;i++) ans[i]=min(ans[i],ans[i-1]); for(int i=1;i<=n;i++) if(ans[i]==INF) cout<<-1<<" "; else cout<<ans[i]<<" "; cout<<endl; } return 0; }