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 }
View Code

 

直接相同数字 把下标放入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 }
View Code

 

posted @ 2020-09-30 19:44  canwinfor  阅读(178)  评论(0)    收藏  举报