2024.10.10 總結

鳶一折紙發表於2024-10-10

A:

賽時發了什麼瘋非要來衝這題。

不妨計各種顏色的寶石為 0/1。

考慮記字首和的最大值為 \(S_\max\),最小值為 \(S_\min\),於是總的限制為 \(|S_\max-S_\min|\leq k\)

考慮反向維護這個限制,即列舉一個 \(i\),然後欽定 \(i\leq S_\min\leq S_\max\leq i+k\),計算對應的序列個數。然後考慮一個實際差值為 \(\Delta=|S_\max-S_\min|\) 的序列,會被統計 \(k-\Delta+1\) 次。記 \(calc(k)\) 為上述過程計算出的序列個數,於是有最終答案為 \(calc(k)-calc(k-1)\)

考慮 \(calc(k)\) 如何計算。考慮把一個 \(0\) 看做是在平面直角座標系上讓 \(x\) 座標 \(+1\),一個 \(1\) 為讓 \(y\) 座標 \(+1\),於是問題轉化為,從 \((0,0)\) 出發,任意時刻在 \(y=x+i\)\(y=x+i+k\) 之間,每次可以向右或向上走一步,問走到 \(n\) 的方案數。

我們考慮條件為不能經過 \(y=x+i-1\)\(y=x+i+k+1\)。我們記一次經過第一條直線的事件為 \(A\),第二條直線為 \(B\),我們考慮對形如 \(AABABBBA\cdots\) 的字首做容斥。

我們把所有 \(A\) 合併在一起,所有 \(B\) 合併在一起,變成 \(ABABA\cdots\),然後一次經過 \(A\) 可以用經典卡特蘭容斥理解為沿著 \(y=x+i-1\) 翻折。

同理 \(AB\) 即為先沿著 \(y=x+i-1\) 翻折,再沿著 \(y=x+i+k+1\) 翻折,我們減去翻折了奇數次的結果,加上翻折了偶數次的結果,即可得到最後答案。

B:

簽到題目。

考慮到當前點最多從前一百個點轉移(\(d_i\leq100\)),將式子放進矩陣里加速就行。

複雜度 \(\mathcal O(d^3 \ log k)\)

C:

沒有這題。

D:

開場覺得是個簡單掃描線,寫完 A 之後發現假了,不過綁包了居然沒爆蛋(?

題解說這才是籤子,沒看出來。

不過正解還是掃描線。

考慮對每種活動區間 \([l,r]\) 增加兩維 \(l',r'\) 分別表示移除左邊界擋板和右邊界擋板之後的活動範圍為 \((l',r)\)\((l,r')\)。那麼兩個區間 \((l_1,r_1,l_1',r_1')\),\((l_2,r_2,l_2',r_2')\) 能夠同時坐人當且僅當 \(l_1\ge r_2'\)\(l_2'\ge r_1\)

由於不同的區間最多隻有 \(4n\) 個,於是可以直接掃描線+set 維護找到。將所有區間按 \(r'\) 排序,記錄 \(f_i/g_i\) 表示考慮了前 \(i\) 個區間,此時最多能坐多少人,並且在坐最多人的基礎上最小的 \(r\),那麼對於某個區間 \((l,r,l',r')\) 有轉移:

\[(f_{r'},g_{r'})\gets(f_{l}+1,r)\ \text{if}\ (g_l\le l')\\ (f_i,g_i)\gets (f_{i-1},g_{i-1}) \]

時間複雜度 \(\mathcal O(n\log n)\)


然後就去體活了(喜,但是打球的時候很餓所以惱了。

相關文章