1 条题解

  • 0
    @ 2025-8-10 17:31:10

    结论:mi=min(b1,,bi1)m_i = \min(b_1, \ldots, b_{i-1}) ,对于每一个 2in2 \leq i \leq n ,当且仅当 bimi<mib_i - m_i < m_i 成立时,才能实现 a=ba = b

    构造:

    从左到右建立数组。对于每一个 ii ,如果有 bi<mib_i < m_i ,那么我们直接添加 bib_i 。否则,我们首先添加 bimib_i - m_i ,然后再添加 mim_i

    证明:

    假设存在 bimimib_i - m_i \geq m_i , 设最小值下标为 jj , 即存在 bibjbjb_i - b_j \geq b_j 其中 j<ij < i

    考虑 ii 点的构成.

    • 如果添加的值 >bj> b_j , 那么值会加在 jj 点, 假设不成立。

    • 如果添加的值 =bj= b_j ,此时值不够,需要第二次添加,但是第二次添加的值会优先加在 jj 点上,假设不成立。

    • 如果添加的值 <bj<b_j ,第二次最大能添加的值为 bjb_j, 超过的话值会加在 jj 点。其中第一次添加的范围是 [1,bj1][1,b_{j}-1] 。那么最后能取得的范围为 [1,bj1+bj][1, b_{j}-1 + b_j] .

    假设不成立,最初结论成立。

    #include<bits/stdc++.h>
    
    using namespace std;
    
    typedef long long LL;
    typedef pair<int, int> PII;
    
    #define x first
    #define y second
    
    const int N = 2e5 + 10, mod = 998244353;
    
    int qmi(int a, int k)
    {
        int res = 1;
        while (k)
        {
            if (k & 1) res = (LL)res * a % mod;
            a = (LL)a * a % mod;
            k >>= 1;
        }
        return res;
    }
    
    
    
    void solve()
    {
        int n;
        cin >> n;
        vector<int> a(n + 1);
        
        for(int i = 1; i <= n; i ++)
            cin >> a[i];
        
        int x = 1e9;
        for(int i = 1; i <= n; i ++)
        {
            int t = (x - 1) * 2 + 1;
            if(a[i] > t)
            {
                cout<< "NO\n";
                return;
            }
            x = min(x, a[i]);
        }
        cout <<"YES\n";
    }
    
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
    	int t = 1;
    	cin >> t;
    	while(t --)
    		solve();
    }
    
    • 1

    信息

    ID
    503
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    7
    已通过
    2
    上传者