【CF 1469 C】 Building a Fence

题意

思考过程

通过观察条件,可以发现每次的选择范围由前一个和当前条件的限制。所以按顺序推进计算范围即可。

/**********showtime************/

        const int maxn = 2e5+9;
        int a[maxn];
        int high[maxn],low[maxn];
int main(){
        int T;  scanf("%d", &T);
        while(T--){
            int n,k;
            scanf("%d%d", &n, &k);
            for(int i=1; i<=n; i++) scanf("%d", &a[i]);
            high[1] = a[1] + k;
            low[1] = a[1] + 1;
            int flag = 1;
            for(int i=2; i<=n; i++){
                high[i] = high[i-1] + k - 1;
                low[i] = low[i-1] - k + 1;

                low[i] = max(low[i], a[i] + 1);
                high[i] = min(high[i], a[i] + k + k - 1);
                if(low[i] > high[i] - k + 1) {
                    flag = 0;
                    break;
                }
            }

            if(a[n] + 1 >= low[n] && a[n] + 1 <=  high[n]){

            }
            else flag = 0;

            if(flag) puts("YES");
            else puts("NO");
        }

        return 0;
}
原文地址:https://www.cnblogs.com/ckxkexing/p/14210889.html