Codeforces Round #681 D

Posted ullio

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #681 D相关的知识,希望对你有一定的参考价值。

Codeforces Round #681 D

大意

给定一个长度为n的序列,每次可以将(A_1,...,A_k)或者(A_m,...,A_n)中的数减一,其中(k,m)是自己选择的数。

问,是否能通过任意次操作,让数列每一项都为0。

思路

可以证明,如果一种情况为可行解,当且仅当可以通过任意操作将序列变为非严格单调序列,所以考虑判定能否成为单调序列。

不失一般性,考虑让序列非严格单调递增。

(c=A_i),其中(i)为第一个满足(A_{i-1} > A_{i})(A_{i+1} > A_{i})的数。

不难发现,前面的数都可以通过从头开始操作变为(A_i),所以此即为后续最多的操作数。

考虑(k),有(A_k < A_{k-1}),显然,要进行(A_{k-1}-A_k)次操作才能满足单调性。

如此,当序列单调后检查操作数和(c)的大小关系即可。

代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;

#define ll long long
#define ull unsigned long long
#define cint const int&
#define Pi acos(-1)

int t, n;
int a[30030];

int main() {
    ios::sync_with_stdio(false);
    cin >> t;
    while(t--) {
        cin >> n;
        for(int i=1; i<=n; i++) cin >> a[i];
        int mn = a[1];
        bool flag = 0;
        for(int i=2; i<=n; i++)
            if(a[i] > a[i-1]) {
                flag = 1;
            } else if(a[i] < a[i-1]){
                if(!flag) mn = min(mn, a[i]);
                else {
                    mn -= a[i-1] - a[i];
                }
            }
        if(mn >= 0) cout << "YES" << endl;
        else cout << "NO" << endl;
    }
    return 0;
}

以上是关于Codeforces Round #681 D的主要内容,如果未能解决你的问题,请参考以下文章

D - Round Subset codeforces837d

CodeForces Round #544 Div.3

Codeforces Round #434 D

Codeforces Round #425 D

Codeforces Round #421 (Div. 2)

Educational Codeforces Round 73