Codeforces Round #616 Div. 2
比赛链接 https://codeforces.com/contest/1291
比赛记录 https://blog.csdn.net/cheng__yu_/article/details/105395197
B. Array Sharpening
题意:问能否把数组变成有一个峰点的情况
思路:用
0
,
1
,
2
,
3
,
…
,
3
,
2
,
1
,
0
0, 1, 2, 3, \dots ,3 ,2 ,1, 0
0,1,2,3,…,3,2,1,0 去匹配是否合适
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=3e5+5,maxm=1e5+5;
const int mod=1e9+7,inf=0x7f7f7f7f;
int t,n;
int a[maxn],b[maxn];
bool check(int a[])
{
int pos=inf;
bool valid=true;
for(int i=1;i<=n;++i)
{
if(a[i]<i-1)
{
pos=i;
break;
}
}
int j=1;
for(int i=n;i>=pos-1;--i)
{
if(a[i]<j-1)
{
valid=false;
break;
}
j++;
}
return valid;
}
int main()
{
cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<=n;++i)
cin>>a[i],b[i]=a[i];
reverse(b+1,b+1+n);
if(check(a)||check(b))
puts("Yes");
else
puts("No");
}
return 0;
}
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=3e5+10,inf=1e9;
int t,n;
int a[maxn];
int main()
{
cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<=n;++i) cin>>a[i];
int i;
for(i=1;i<=n;++i)
{
if(a[i]<i-1)
break;
}
bool ok=true;
for(int j=n;j>=1;--j)
{
int x=n-j+1;
if(a[j]<x-1)
{
if(j+1>i-1)
ok=false;
break;
}
}
puts(ok?"YES":"NO");
}
return 0;
}
C. Mind Control(枚举 **)
链接:https://codeforces.com/contest/1291/problem/C
题意:有一个长度为 n 的数组 a。n 个人排成一队拿元素,可拿剩余数组的第一个或者最后一个,你排在第m位拿,你可以控制 k 个人让他们拿第一个或者最后一个,不受控制的人任意拿。问不管其余不受控制的人怎么拿,你都能拿到的最大元素是多少。(也就是你能拿到的最小元素最大是多少) ( 1 ≤ m < n ≤ 3500 , 0 ≤ k ≤ n − 1 , 1 ≤ a i ≤ 1 0 9 ) (1\le m < n \le 3500, 0 \le k \le n-1,1\le a_i \le 10^9) (1≤m<n≤3500,0≤k≤n−1,1≤ai≤109)
思路:枚举你能控制的人拿前面的 i 个,不受控制的人拿前面的 j 。那么你能拿到的就是 a[i+j+1]和a[i+j+1+n-m]这两个。受控制的取最大,不受控制的取最小
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=3e5+10,inf=1e9;
int t,n,m,k;
int a[maxn];
int main()
{
cin>>t;
while(t--)
{
cin>>n>>m>>k;
for(int i=1;i<=n;++i) cin>>a[i];
k=min(m-1,k);
int x=max(0,m-k-1);
int ans=0;
for(int i=0;i<=k;++i)
{
int res=inf;
for(int j=0;j<=x;++j)
res=min(res,max(a[i+j+1],a[i+j+1+n-m]));
ans=max(ans,res);
}
cout<<ans<<"\n";
}
return 0;
}
D. Irreducible Anagrams(思维+构造)
题意:给定一个 l 、r,问子串l、r是否存在一个非可约束Anagram。
思路:一个字母是可以的,然后首尾不同是可以构造的,3个字母是可以构造的
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=2e5+10,inf=1e9;
string s;
int q,l,r;
int pref[30][maxn];
int main()
{
cin>>s>>q;
s="0"+s;
int n=s.size()-1;
for(int i=1;i<=n;++i)
pref[s[i]-'a'+1][i]++;
for(int i=1;i<=26;++i)
for(int j=1;j<=n;++j)
pref[i][j]+=pref[i][j-1];
while(q--)
{
cin>>l>>r;
if(l==r||s[l]!=s[r])
{
puts("Yes");
continue;
}
int cnt=0;
for(int i=1;i<=26;++i)
{
if(pref[i][r]-pref[i][l-1]>0)
cnt++;
}
puts(cnt>=3?"Yes":"No");
}
return 0;
}