Codeforces Round #673 (Div. 1) A. k-Amazing Numbers ###K ###K //K
题目链接:https://codeforces.ml/contest/1416/problem/A
题意:问1~n 长度为k 的 出现的所有的子串中的数字最小的数字是多少
思路: 题目给的a[i]<=n 就暗示了要从1到n 枚举, 那么每个数字单独处理他最大能覆盖到的半径即可
对半径从小到达排序 双指针扫一遍即可
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define pb push_back 5 const int maxn =3e5+10; 6 const int mod=998244353; 7 int a[maxn]; 8 struct ac 9 { 10 int p,v; 11 }; 12 ac f[maxn]; 13 int ans[maxn]; 14 int last[maxn]; 15 bool cmp(ac a,ac b) 16 { 17 return a.v<b.v; 18 } 19 20 int main() 21 { 22 ios::sync_with_stdio(false); 23 cin.tie(0); 24 25 int t; 26 cin>>t; 27 while(t--) 28 { 29 int n; 30 cin>>n; 31 for(int i=1;i<=n;i++) 32 { 33 f[i].p=f[i].v=last[i]=0; 34 ans[i]=1e9; 35 } 36 ans[0]=1e9; 37 for(int i=1;i<=n;i++) 38 { 39 cin>>a[i]; 40 } 41 for(int i=1;i<=n;i++) 42 { 43 f[i].p=i; 44 int x=a[i]; 45 f[x].v=max(f[x].v,i-last[x]); 46 last[x]=i; 47 } 48 for(int i=1;i<=n;i++) 49 { 50 f[i].v=max(f[i].v,n+1-last[i]); 51 } 52 sort(f+1,f+1+n,cmp); 53 /*for(int i=1;i<=5;i++) 54 cout<<f[i].v<<" "<<f[i].p<<'\n';*/ 55 int l=1; 56 for(int i=1;i<=n;i++) 57 { 58 while(f[l].v<=i&&l<=n) 59 { 60 ans[i]=min(ans[i],f[l].p),l++; 61 } 62 ans[i]=min(ans[i],ans[i-1]); 63 64 } 65 for(int i=1;i<=n;i++) 66 { 67 if(ans[i]==1e9) 68 ans[i]=-1; 69 cout<<ans[i]<<" "; 70 } 71 cout<<'\n'; 72 } 73 74 75 76 77 78 79 80 81 82 83 84 85 86 }
直接相同数字 把下标放入vector中 然后找每个数字最大的间隔是多少 注意要先把0和n+1放入到其中去
然后 给pre[i] 赋值, 然后从mx~n 都是可以 给赋值i的 因为单调性的原因,我们只改变pre[mx]
到时候循环的时候 如果 pre[i]>pre[i-1] 再把pre[i] 更新为pre[i-1] 即可
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=3e5+10; 4 const int mod=1e9+7; 5 #define ll long long 6 #define ull unsigned long long 7 #define pi pair<int,int> 8 #define fi first 9 #define sc second 10 #define pb push_back 11 12 vector<int>E[maxn]; 13 int pre[maxn]; 14 15 16 17 int main() 18 { 19 ios::sync_with_stdio(false); 20 cin.tie(0); 21 int t; 22 cin>>t; 23 while(t--) 24 { 25 int n; 26 cin>>n; 27 for(int i=0;i<=n;i++) E[i].clear(),E[i].pb(0),pre[i]=1e9; 28 for(int i=1;i<=n;i++) 29 { 30 int x; 31 cin>>x; 32 E[x].pb(i); 33 } 34 for(int i=1;i<=n;i++) E[i].pb(n+1); 35 36 for(int i=1;i<=n;i++) 37 { 38 int len=E[i].size(); 39 int mx=0; 40 for(int j=0;j<len-1;j++) 41 { 42 mx=max(mx,E[i][j+1]-E[i][j]); 43 } 44 pre[mx]=min(pre[mx],i); 45 } 46 for(int i=1;i<=n;i++) 47 { 48 if(pre[i]>pre[i-1]) pre[i]=pre[i-1]; 49 } 50 for(int i=1;i<=n;i++) 51 { 52 if(pre[i]==1e9) pre[i]=-1; 53 if(i!=1) cout<<" "; 54 cout<<pre[i]; 55 } 56 cout<<'\n'; 57 58 } 59 60 61 62 63 }

浙公网安备 33010602011771号