• 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)次操作才能使前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;
    }
    
  • 相关阅读:
    .net core Docker 整套部署流程
    Mysql 关键字 ESCAPE
    ZJOI2022 题解
    多项式全家桶
    THUPC2022 游记
    FidderComposer(自定义请求)
    Postman使用详解
    FiddlerAutoResponder(自动响应器)
    Fiddler—工具栏
    Fiddler—过滤器(Filters)
  • 原文地址:https://www.cnblogs.com/ullio/p/13939217.html
Copyright © 2020-2023  润新知