cf -1469C - Building a Fence

1469C - Building a Fence

// 思路
对于第i块栅栏,它所处的高度范围由第i - 1块栅栏和地面高度决定。
1. 用l[i]表示第i块栅栏的最低高度,r[i]表示第i块栅栏的最高高度。
2. l[i]:
   因为两块栅栏之间必须要接触1米,所以根据这个条件
   相对于第i - 1块栅栏的最低高度l[i - 1],l[i]还可以下降k - 1米。
   所以l[i] = l[i - 1] - k + 1;
   又因为最低高度要大于地面的高度。
   所以l[i] = max(l[i - 1] - k + 1,h[i]);
3. r[i]:
   因为两块栅栏之间必须要接触1米,所以根据这个条件
   相对于第i - 1块栅栏的最高高度r[i - 1],l[i]还可以上升k - 1米。
   所以r[i] = r[i - 1] + k - 1;
   又要求最高高度不能超过地面高度 + k - 1;
   所以r[i] = min(r[i - 1] + k - 1,h[i] + k - 1);
4. 最后只要判断每一个l[i] 与 r[i] 是否冲突即可。
5. 还需注意最后一块栅栏必须接触地面。所以l[n] <= h[n] <= r[n];
#include<iostream>

using namespace std;

const int N = 200010;
int h[N];

int main()
{
    int t;
    cin >> t;
    while(t --)
    {
        int n,k;
        cin >> n >> k;
        int flag = 0;
        for(int i = 1; i <= n; i ++) cin >> h[i];
        
        int l = h[1],r = h[1];
        
        for(int i = 2; i <= n; i ++)
        {
            l = max(h[i],l - k + 1);
            r = min(h[i] + k - 1,r + k - 1);
            if(l > r) 
            {
                flag = 1;
                break;
            }
        }
        if(h[n] < l) flag = 1;
        if(!flag) cout << "YES";
        else cout << "NO";
        cout << endl;
    }
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值