題庫連接php
給你一個長度爲 \(n\) 的序列。\(m\) 次詢問,每次詢問序列的一個區間 \([l,r]\)。對於 \([l,r]\) 內的全部子區間,詢問值域是否連續。若存在一個子區間不連續則輸出 NO
。c++
\(1\leq n,m\leq 100000\)數組
平常划水。spa
顯然,知足條件的區間中任意兩個相鄰的數差值不超過 \(1\)。而且這個條件與原問題等價。code
預處理出一個數組 \(maxr_i\) 表示第 \(i\) 位向右延伸的最遠位置,這個數組是能夠繼承的,能夠 \(O(n)\) 求出。對於詢問,直接比較 \(maxr_l\) 與 \(r\) 的大小便可。繼承
#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; }