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

2250A Threshold Movement

来源:Codeforces ★ 800

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

算法如山行则将至

题目描述

有n个位置1n各有一个重量w_i的物体,位置0和n+1为空。选择一个整数k,若w_i<k则物体左移,w_i>k则右移,w_i=k则过程失败。判断是否存在一个k使得所有物体移动后每个位置1n各恰好有一个物体。

代码

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n,t;
    cin>>t;
    while(t--)
    {
    cin>>n;
    int max_=INT_MAX,min_=INT_MIN;
    vector<int> a(n);
    for(int i=0;i<n;i++)
    cin>>a[i];
    if(n%2==1){
    cout<<"NO"<<endl;
    continue;
    }bool flag=false;
    for(int i=0;i<n-1;i++)
    {
        if(i%2==0){max_=min(max_,a[i]);
            if(a[i]<=(a[i+1]+1))
            {
                cout<<"NO"<<endl;flag=true;break;
            }
        }
        else if(i%2==1){min_=max(min_,a[i]);
            if(a[i]>=(a[i+1]-1))
            {
                cout<<"NO"<<endl;flag=true;break;
            }
        }
    }
    min_=max(min_,a[n-1]);
    if(max_>(min_+1)&&flag==false)
        {
            cout<<"YES"<<endl;
        }
        else if(flag==false)
        {
            cout<<"NO"<<endl;
        }
    }
    cin>>n;
}