Codeforces Round #616 (Div. 2) Feb/02/2020 22:05UTC+8

比赛链接 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) (1m<n3500,0kn1,1ai109)

思路:枚举你能控制的人拿前面的 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值