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定理:棟爺的部落格
對於這道題,假設我們欽定每個區間要扔多少石子。那麼剩下我們顯然可以採用網路流是否滿流驗證這組解是否合法。
實際上這是一個二分圖的多重匹配問題。
假設某個區間
要扔
個石子,那麼我們可以把這個區間拆成
個點分別連完全相同的邊。同時把所有石子堆拆成
個點一樣連完全相同的邊。這樣這就轉化成了一個二分圖的最大匹配問題。
首先將區間按左端點排序,編號,拆點之後假設是集合
,石子是集合
,運用Hall定理現在我們要列舉集合
的任意一個子集,判斷每個點連出的邊數是否大於等於集合大小。
Hall定理的幾個套路
套路1
驗證集合
和
時,若能將
和
分別分成兩個子集
,使得
不向
連邊,
不向
連邊,那麼可以直接分別驗證
,
是否合法。
這是顯然的,因為兩個不聯通的塊肯定是互不影響的。
應用到本題,兩個不相交的區間可以分開驗證。
套路2
在對應的
集合不變的情況下,如果
,那麼若
合法,那麼
一定合法。
顯然
的約束條件更緊。
應用到本題。首先,一個區間拆出來的
個點可以一起驗證,因為他們的連邊情況相同。
其次,區間按左端點排序之後,假設驗證兩個編號不相鄰的相交區間
,假設
那麼考慮新增
,由於區間互不包含的性質,所以顯然
,因此,新增區間
不會導致
集合的變化,但是
集合增多,所以可以
三個區間一起驗證。
基於此,我們驗證的一定是編號連續的若干個區間。
資料結構優化
寫出式子。
假設欽定後每個區間取
個,我們要驗證的即:
假設
是
的字首和,
是
的字首和。
即