1. 程式人生 > 其它 >《<遇到困難睡大覺>命題報告》學習筆記

《<遇到困難睡大覺>命題報告》學習筆記

睡大覺。

《<遇到困難睡大覺>命題報告》學習筆記

簡要題意

給定 \(n,k,\{(a_i,b_i)\}_{i=1}^n\),求出 \(\max\{\min_{i=1}^n\{a_{p_i}+ik\}-\max_{i=1}^n\{b_{p_i}+ik\}|p\in \mathfrak{S}_n\}\)\(1\leq a_i,b_i\leq 10^9,kn\leq 10^9,1\leq n\leq 10^5\)

題解

答案等價於 \(\max\{\min_{i=1}^n\{a_i+q_ik\}-\max_{i=1}^n\{b_i+q_ik\}|q\in \mathfrak{S}_n\}\)。進一步地,可以發現答案只與排列中的相對位置有關,於是 \(q\)

可以取數軸上的任意一段連續的 \(n\) 個整點(不妨設為 \([t,t+n-1]\cap\mathbb{Z}\))而不影響答案。

考慮列舉 \(M=\max\{b_i+q_ik\}\),可以得到 \(q_i\) 的上界:\(\forall i,q_i\leq r_i=\left\lfloor\frac{M-b_i}{k}\right\rfloor\)。根據貪心策略,此時選擇最大的有解的 \(t\) 一定最優。由 Hall 定理,此時 \(t=\min_{i=1}^n\{r_i-i+1\}\)。同時,注意到當 \(M\) 增加 \(k\) 時,\(r_i\)\(t\) 都會增加 \(1\)

,於是可以只在 \([0,k-1]\) 的範圍內列舉 \(M\)

二分答案 \(mid\),列舉 \(M\in[0,k-1]\),可以得到 \(q_i\) 的上下界:\(\forall i,l_i=\max\{\left\lceil\frac{M+mid-a_i}{k}\right\rceil,t\}\leq q_i\leq r_i=\min\{\left\lfloor\frac{M-b_i}{k}\right\rfloor,t\}\)。由 Hall 定理,此時有解當且僅當不存在一個區間 \([l,r](l\leq r)\),使得 \(s(l,r)>r-l+1\),其中 \(s(l,r)\)

表示被 \([l,r]\) 包含的 \([l_i,r_i]\) 區間個數。

注意到 \(t\)\(M\)\(0\)\(k-1\) 列舉的過程中只會增加 \(1\)(或不變),不妨設為從 \(t'\) 變為 \(t'+1\),變化的時間為 \(tt\)(若不變,則為 \(\infty\))。接下來,只需要分別對 \(M\in[0,tt-1],t=t'\)\(M\in[tt,k-1],t=t'+1\) 分別判斷即可。

考慮對 \(M\in[L,R]\) 和確定的 \(t\) 進行判斷。注意到 \(R-L+1<=k\),於是 \(l_i,r_i\)\(M\)\(L\)\(R\) 列舉的過程中只會增加 \(1\)(或不變),不妨分別設為從 \(l_i',r_i'\) 變為 \(l_i'+1,r_i'+1\),變化的時間為 \(tl_i,tr_i\)(若不變,則為 \(\infty\))。

\(r_i\) 進行排序。記 \(q(i,j)=r_j-l_i+1-s(l_i,r_j)\),那麼有解當且僅當不存在 \(i<j\) 使得 \(q(i,j)<0\)。注意到 \(l_i\) 之間、\(r_i\) 之間的相對順序不會改變,於是 \(s(l_i,r_j)\) 不會改變。那麼只需要對 \(q'(i,j)=r_j'-l_i'+1-s(l_i,r_j)\) 進行分類討論:

  • \(q'(i,j)<-1\) 時,恆非法
  • \(q'(i,j)=-1\) 時,當且僅當 \(tr_j\leq M<tl_i\)合法
  • \(q'(i,j)=0\) 時,當且僅當 \(tl_i\leq M<tr_j\)非法
  • \(q'(i,j)>0\) 時,恆合法

注意到固定 \(j\) 時,同種限制取最小的 \(tl_i\) 一定最緊。於是可以從小到大列舉 \(r_j'\),用線段樹維護 \(q'(i,j)\) 的最小值和次小值以及此時分別對應的最小的 \(tl_i\)(這樣當不存在 \(q'(i,j)<-1\) 的情況時能得到所有限制)。

最終會得到 \(O(n)\) 個限制,對於 \(q'(i,j)=-1\) 得到的限制可以輕鬆求出它們的交,然後將 \(q'(i,j)=0\) 得到的限制排序後和前面求得的交進行對稱差判斷即可。

時間複雜度 \(O(n\log n\log A)\),其中 \(A\) 是答案的值域大小(此題中為 \(2\times10^9\))。