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')\) 有轉移:
時間複雜度 \(\mathcal O(n\log n)\)。
然後就去體活了(喜,但是打球的時候很餓所以惱了。