1. 程式人生 > 其它 >Luogu5629 【AFOI-19】區間與除法

Luogu5629 【AFOI-19】區間與除法

技術標籤:資料結構# ST表# 狀態壓縮

原題連結: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]

[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

0 個 “原數”,區間 [ 1 , 2 ] , [ 2 , 2 ] [1,2],[2,2] [1,2],[2,2] 最多消滅 1 1 1 個數,消滅最多數前提下最少需要 1 1 1 個 “原數” 。

#樣例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 n100,m10,d=2,q10

對於 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} n5×105,m60,2d10,q106,0ai,bi263

在這裡插入圖片描述
特殊性質:資料經過構造。

題解

比較好想,因為 d d d是固定的,所以一個數能不能被原數消滅是可以預處理出來的。同時原數也有可能被另一個原數消滅,所以我們需要先“化簡”一下原數集合,把能被其他原數消滅的原數刪去,再將原數排好序,方便後續的查詢。

因為一個原數可以消滅多個數,需要合併區間的資訊,看到 m ≤ 60 m\le 60 m60,直接明示狀態壓縮,用一個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