🔗 AWC0022C Road Pothole Survey

Problem Statement

題目簡述

NN 塊磁磚排成一列,其中 MM 塊已損壞。
KK 輛車分別行經連續區段 [Li,Ri][L_i, R_i],若該區段內損壞磁磚數量 T\geq T,則報告為「需要維修」。> 對每輛車輸出判定結果。

Constraints

約束條件

  • 1N2×1051 \leq N \leq 2 \times 10^5
  • 1MN1 \leq M \leq N1K2×1051 \leq K \leq 2 \times 10^51TN1 \leq T \leq N
  • 1BiN1 \leq B_i \leq N,所有 BiB_i 互不相同
  • 1LiRiN1 \leq L_i \leq R_i \leq N

思路:前綴和

典型的區間計數問題,用前綴和即可 O(1)O(1) 回答每筆查詢。

建立長度為 NN 的 0/1 陣列 A,損壞的位置標記為 1,再對 A 做前綴和得到 s。對於查詢 [L,R][L, R],損壞磁磚數量為 s[R]s[L1]s[R] - s[L-1],與閾值 TT 比較即可。

複雜度分析

  • 時間複雜度:O(N+M+K)\mathcal{O}(N + M + K)
  • 空間複雜度:O(N)\mathcal{O}(N)

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from itertools import accumulate


def solve():
N, M, K, T = map(int, input().split())
B = list(map(int, input().split()))

A = [0] * N
for b in B:
A[b - 1] = 1
s = list(accumulate(A, initial=0))

ans = []
for _ in range(K):
L, R = map(int, input().split())
ans.append("YES" if s[R] - s[L - 1] >= T else "NO")
print(*ans, sep="\n")


if __name__ == "__main__":
solve()