[BZOJ 5127][Lydsy1712月賽]數據校驗

Description

題庫連接php

給你一個長度爲 \(n\) 的序列。\(m\) 次詢問,每次詢問序列的一個區間 \([l,r]\)。對於 \([l,r]\) 內的全部子區間,詢問值域是否連續。若存在一個子區間不連續則輸出 NOc++

\(1\leq n,m\leq 100000\)數組

Solution

平常划水。spa

顯然,知足條件的區間中任意兩個相鄰的數差值不超過 \(1\)。而且這個條件與原問題等價。code

預處理出一個數組 \(maxr_i\) 表示第 \(i\) 位向右延伸的最遠位置,這個數組是能夠繼承的,能夠 \(O(n)\) 求出。對於詢問,直接比較 \(maxr_l\)\(r\) 的大小便可。繼承

Code

#include <bits/stdc++.h>
using namespace std;
const int N = 100000+5;

int n, m, b[N], l, r, maxr[N];

int main() {
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++) scanf("%d", &b[i]);
    for (int i = 1; i <= n; i++) {
        if (maxr[i-1] >= i) maxr[i] = maxr[i-1];
        else {
            int loc = i;
            while (abs(b[loc]-b[loc+1]) <= 1) ++loc;
            maxr[i] = loc;
        }
    }
    while (m--) {
        scanf("%d%d", &l, &r);
        if (maxr[l] >= r) puts("YES");
        else puts("NO");
    }
    return 0;   
}
相關文章
相關標籤/搜索