ACM 训练日志记录 · 思考 · 成长 提交 / 修改记录
郭一鸣 / 题目列表训练档案
导出

2242B Educational Codeforces Round 192 (Rated for Div. 2) B

来源:Codeforces ★ 1000

本题活力0.21按难度、完成结果与训练证据估算

算法如山行则将至

题目描述

给定只含有123的数组,判断是否能将数组切割成这样的3份:左边那一份中1的数量不少于2和3的数量之和;中间那一份中1和2的数量之和不少于3的数量量;右段没有限制,只要非空即可。

代码

#include<iostream>
using namespace std;
int a[200010];
int pre[200010];
int mx[200010];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;cin>>n;
        for(int i=1;i<=n;i++)cin>>a[i];
        pre[0]=0;
        for(int i=1;i<=n;i++)
        {
            pre[i]=pre[i-1];
            if(a[i]==1||a[i]==2)pre[i]++;
            else pre[i]--;
        }
        mx[n-1]=pre[n-1];
        for(int i=n-2;i>=1;i--)
        {
            mx[i]=mx[i+1];
            if(pre[i]>mx[i])mx[i]=pre[i];
        }
        int left=0;
        bool flag=false;
        for(int i=1;i<=n-2;i++)
        {
            if(a[i]==1)left++;
            else left--;
            if(left>=0&&mx[i+1]>=pre[i])
            {
                flag=true;
                break;
            }
        }
        if(flag)cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    return 0;
}