Luogu5629 【AFOI-19】區間與除法
原題連結:https://www.luogu.com.cn/problem/P5629
區間與除法
題目背景
SY 好不容易才解出QM給她的數學題,在恰午飯的時候,QM 向她的腦洞裡塞了個幻想的泡泡……SY 戳開一看,又是長長的一串數字!
SY 實在是不想思考了,她決定用小學的除法消滅她腦洞裡的數字.
題目描述
定義 o p op op 操作意義為將當前數除以 d d d 並向下取整.
SY 現在有 m m m 個“原數”,若一個數經過若干次 o p op op 操作(包括 0 0 0 次)後能變為這個“原數”,那麼這個數是可以被這個“原數”所消滅的。注意,“原數”是不會被消耗的.
現在 SY 想問你,對於一個區間 [ l , r ] [l,r] [l,r],在消滅最多個數的前提下最少需要多少個“原數”?
輸入格式
第一行 4 4 4 個數,分別是 n , m , d , q n,m,d,q n,m,d,q,分別表示數列 { a } \{a\} {a} 元素個數,SY 擁有的 “原數” 個數, o p op op 操作引數,詢問個數。
第二行為 { a } \{a\} {a} 數列,即需要被消滅的數列。
第三行為 m m m 個“原數”。
接下來
q
q
q 行,每行兩個數
l
l
l 和
r
r
r,表示詢問區間為
[
l
,
r
]
[l,r]
輸出格式
按照詢問順序,每一行輸出一個整數表示答案.
輸入輸出樣例
輸入 #1
2 3 3 3
0 20
6 6 6
1 1
2 2
1 2
輸出 #1
0
1
1
輸入 #2
6 3 3 3
6 5 10 15 19 7
2 5 10
1 6
1 4
4 6
輸出 #2
3
3
2
說明/提示
樣例解釋:
#樣例1 : 20 20 20 經過一次 o p op op 操作(除以 3 3 3 向下取整)可以變成 6 6 6,而 0 0 0 不能經過若干次 o p op op 操作變成 6 6 6 。
所以區間
[
1
,
1
]
[1,1]
[1,1] 最多消滅
0
0
0 個數,消滅最多數前提下最少需要
0
0
#樣例2 : 2 2 2 能消滅 { 6 , 19 , 7 } \{6,19,7\} {6,19,7} , 5 5 5 能消滅 { 5 , 15 } \{5,15\} {5,15} , 10 10 10 能消滅 { 10 } \{10\} {10} , 所以區間 [ 1 , 6 ] , [ 1 , 4 ] [1,6],[1,4] [1,6],[1,4] 最少能用所有 “原數” 全部消滅,區間 [ 4 , 6 ] [4,6] [4,6] 能用 2 , 5 2,5 2,5 全部消滅。
資料範圍:
對於 30 % 30\% 30% 的資料: n ≤ 100 , m ≤ 10 , d = 2 , q ≤ 10 n\le100,m\leq10, d=2, q\le 10 n≤100,m≤10,d=2,q≤10
對於 100 % 100\% 100% 的資料: n ≤ 5 × 1 0 5 , m ≤ 60 , 2 ≤ d ≤ 10 , q ≤ 1 0 6 , 0 ≤ a i , b i ≤ 2 63 n\le5\times 10^{5},m\leq60,2\leq d\leq10,q\le10^{6},0\le a_i,b_i\le 2^{63} n≤5×105,m≤60,2≤d≤10,q≤106,0≤ai,bi≤263
特殊性質:資料經過構造。
題解
比較好想,因為 d d d是固定的,所以一個數能不能被原數消滅是可以預處理出來的。同時原數也有可能被另一個原數消滅,所以我們需要先“化簡”一下原數集合,把能被其他原數消滅的原數刪去,再將原數排好序,方便後續的查詢。
因為一個原數可以消滅多個數,需要合併區間的資訊,看到
m
≤
60
m\le 60
m≤60,直接明示狀態壓縮,用一個long long
的
63
63
63個二進位制位就可以完美表示出整個區間需要的原數狀態,並且能做到
O
(
1
)
O(1)
O(1)合併。再看到詢問
1
0
6
10^6
106,明示卡
O
(
l
o
g
2
n
)
O(log_2n)
O(log2n)演算法,就自然想到
S
T
\mathcal{ST}
ST表,於是這題就做完了。
程式碼
思路簡單,但是為什麼沒有一次過呢,又雙叒叕是因為™的long long
,