1. 程式人生 > >bzoj2138: stone Hall定理 線段樹

bzoj2138: stone Hall定理 線段樹

bzoj2138: stone

Description

話說Nan在海邊等人,預計還要等上M分鐘。為了打發時間,他玩起了石子。Nan搬來了N堆石子,編號為1到N,每堆
包含Ai顆石子。每1分鐘,Nan會在編號在[Li,Ri]之間的石堆中挑出任意Ki顆扔向大海(好疼的玩法),如果[Li,R
i]剩下石子不夠Ki顆,則取儘量地多。為了保留扔石子的新鮮感,Nan保證任意兩個區間[Li,Ri]和[Lj,Rj],不會
存在Li<=Lj&Rj<=Ri的情況,即任意兩段區間不存在包含關係。可是,如果選擇不當,可能無法扔出最多的石子,
這時NN就會不高興了。所以他希望制定一個計劃,他告訴你他m分鐘打算扔的區間[Li,Ri]以及Ki。現在他想你告訴
他,在滿足前i-1分鐘都取到你回答的顆數的情況下,第i分鐘最多能取多少個石子。

Input

第一行正整數N,表示石子的堆數;
第二行正整數x,y,z,P,(1<=x,y,z<=N;P<=500)
有等式A[i]=[(i-x)2+(i-y)2+(i-z)^2] mod P;
第三行正整數M,表示有M分鐘;
第四行正整數K[1],K[2],x,y,z,P,(x,y,z<=1000;P<=10000)
有等式K[i]=(xK[i-1]+yK[i-2]+z)mod P。
接下來M行,每行兩個正整數L[i],R[i]。
N<=40000 M<=N 1<=L[i]<=R[i]<=N A[i]<=500

Output

有M行,第i行表示第i分鐘最多能取多少石子。

Sample Input

5
3 2 4 7
3
2 5 2 6 4 9
2 4
1 2
3 5

Sample Output

2
5
5
【樣例說明】
石子每堆個數分別為0,5,2,5,0。
第1分鐘,從第2到第4堆中選2個;
第2分鐘,從第1到第2堆中選5個;
第3分鐘,從第3到第5堆中選8個,但最多隻能選5個。

分析

二分圖的Hall定理:棟爺的部落格

對於這道題,假設我們欽定每個區間要扔多少石子。那麼剩下我們顯然可以採用網路流是否滿流驗證這組解是否合法。
實際上這是一個二分圖的多重匹配問題。
假設某個區間 [

l i , r i ] [l_i,r_i] 要扔 k i k_i 個石子,那麼我們可以把這個區間拆成 k i k_i 個點分別連完全相同的邊。同時把所有石子堆拆成 a i a_i 個點一樣連完全相同的邊。這樣這就轉化成了一個二分圖的最大匹配問題。
首先將區間按左端點排序,編號,拆點之後假設是集合 X |X| ,石子是集合 Y |Y| ,運用Hall定理現在我們要列舉集合 X |X| 的任意一個子集,判斷每個點連出的邊數是否大於等於集合大小。

Hall定理的幾個套路

套路1

驗證集合 X |X| Y |Y| 時,若能將 X |X| Y |Y| 分別分成兩個子集 X S , X T , Y S , Y T |X_S|,|X_T|,|Y_S|,|Y_T| ,使得 X S |X_S| 不向 Y T |Y_T| 連邊, X T |X_T| 不向 Y S |Y_S| 連邊,那麼可以直接分別驗證 X S , Y S |X_S|,|Y_S| X T , Y T |X_T|,|Y_T| 是否合法。
這是顯然的,因為兩個不聯通的塊肯定是互不影響的。
應用到本題,兩個不相交的區間可以分開驗證。

套路2

在對應的 X |X| 集合不變的情況下,如果 Y S Y T Y_S\subseteq Y_T ,那麼若 X , Y T |X|,|Y_T| 合法,那麼 X , Y S |X|,|Y_S| 一定合法。
顯然 X , Y T |X|,|Y_T| 的約束條件更緊。
應用到本題。首先,一個區間拆出來的 k i k_i 個點可以一起驗證,因為他們的連邊情況相同。
其次,區間按左端點排序之後,假設驗證兩個編號不相鄰的相交區間 x , y x,y ,假設 x &lt; z &lt; y x&lt;z&lt;y 那麼考慮新增 z z ,由於區間互不包含的性質,所以顯然 r x &lt; r z &lt; r y r_x&lt;r_z&lt;r_y ,因此,新增區間 z z 不會導致 X |X| 集合的變化,但是 Y |Y| 集合增多,所以可以 x , z , y x,z,y 三個區間一起驗證。
基於此,我們驗證的一定是編號連續的若干個區間。

資料結構優化

寫出式子。
假設欽定後每個區間取 b i b_i 個,我們要驗證的即:
l , r i = l r b i i = s t [ l ] e d [ r ] a i \forall l, r\sum_{i=l}^r b_i \le \sum_{i=st[l]}^{ed[r]} a_i
假設 B i B_i b i b_i 的字首和, A i A_i a i a_i 的字首和。
l , r B r B l 1 A e d [ r ] A s t [ l ] 1 \forall l, r B_r-B_{l-1} \le A_{ed[r]}-A_{st[l]-1}