The 2024 CCPC Shandong Invitational Contest and Provincial Collegiate Programming Contest

FantasyNumber發表於2024-10-04

比賽連結

C. Colorful Segments 2

考慮最小的分組數量,可以先按左端點排序,然後每次貪心地找到前面一個最大右端點 \(r_j < l_i\) 的組加入。

考慮計數,還是同樣地按左端點排序,那麼假設現在有 \(k\) 個組,每個組最大右端點是 \(g_i\)(沒有元素則 \(g_i = 0\)),那麼每次可以選擇一個 \(g_j < l_i\) 的組並且把 \(g_j\) 更新為 \(l_i\)。注意到我們不需要關心具體的 \(g_j\),只用關心 \(g_j < l_i\) 的數量。由於 \(l_i\) 是單增的,所以所有 \(g_j < l_i\) 的組 \(j\) 本質相同。那麼就是每次查詢 \(g_j < l_i\) 的數量,並且將其減 \(1\),並插入一個 \(r_i\),可以用堆模擬。複雜度 \(\Theta(n \log n)\)

E. Sensors

由於恰好有 \(1\) 個點的線段是有用的,且每個點不會被重新加入,那不妨考慮每次刪除點的時候快速找到所有從 \(>1\) 個變成 \(1\) 個的線段,和從 \(1\) 個變成 \(0\) 個的線段。

\(1\) 個變成 \(0\) 個是好維護的,只需要把 \(1\) 個的線段插入到那個點的 vector 中,刪除的時候直接減去所有的貢獻即可。

\(>1\) 個變成 \(1\) 個時,線段的左右端點恰好跨越一個點。設當前剩下的點座標是 \(pos_1 < pos_2 < ... < pos_m\) 那麼不妨用一個 multiset 維護每個 \(r_j \in [pos_i, pos_{i+1} - 1]\)\(l_j\),刪除 \(pos_i\) 時直接把 \(st_{pos_i}\) 合併到 \(st_{pos_{i-1}}\),並訪問 \(st_{pos_{i-1}}\)\(st_{pos_{i+1}}\) 最大的 \(l_j\) 更新即可。複雜度 \(\Theta(n\log^2n)\)

考慮更優秀的複雜度,把每個線段插入到線段樹上的 \(\log n\) 個節點,然後對於每個線段維護它所在的所有節點中點個數 \(=0,=1,>1\) 的節點個數,當更新一個節點 \(u\) 時,若 \(sum_u \le 1\) 就訪問所有這個節點上的線段更新即可。複雜度 \(\Theta(n\log n)\)

G. Cosmic Travel

差分轉化為 \(x \le m\) 的第 \(k\) 大和,那麼套路地列舉 \(x\)\(m\) 的 lcp 下一位,在 trie 上模擬前這些位(若這一位是 \(0\),則先看 \(siz_{ls}\),不夠就到 \(rs, k \leftarrow k - siz_{ls}\)),然後拆成 \(\Theta(\log V)\) 個詢問一個子樹異或任意數(不能超過這個子樹能表示的最大數)的第 \(k_i\) 大和。注意到這個東西是與詢問無關的,設 \(dp_{i,j}\)\(i\) 子樹異或任意數的第 \(j\) 大和,狀態數量為 \(\Theta(n \log V)\) 的(每個葉子統計 \(\Theta(\log V)\) 次)。

這裡為了方便,可以把和設為只看子樹裡的這些位的和,類似地模擬轉移即可。

複雜度 \(\Theta((n+q)\log V)\)

L. Intersection of Paths

考慮對於一個 \(k\),有那些點可能成為並的一個端點,考慮每一條邊 \((u,v)\),如果刪掉這條邊後 \(\min(siz_u,siz_v) \ge k\) 這條邊就合法,那麼 \(u,v\) 就合法。那麼假如不考慮更改邊的話,答案就是隻取這些點組成的虛樹(一定是原樹的一個聯通塊)的直徑。

考慮 \(k\) 不同,並且加入更改邊,由於大的 \(k\) 對應聯通塊一定被小 \(k\) 對應的完全包含,那麼可以直徑從小到大掃描線,每次從 \(k \to k + 1\) 時,把 \(\min(siz_u,siz_v) = k\) 的邊刪掉(更改邊權為 \(0\))。

那麼就是要實現動態修改邊權,查詢直徑。考慮在尤拉序上做,每次遍歷到 \(u\) 在 dfs 序後加入 \(u\),遍歷 \(u\)每個 兒子回來後再加入 \(u\)。然後就是要找到一個區間 \([l,r]\)\(\max\limits_{l\le L \le a \le R\le r} dep_L + dep_R - 2 \times dep_a\),其中 \(a\) 肯定是 \([L,R]\)\(dep\) 最小那個。於是線段樹上維護區間資訊 \(ans,ansl,ansr,maxd,mind\) 對應上述答案、\(\max\limits_{L \le a} dep_L - 2 \times dep_a\)\(\max\limits_{a \le R} dep_R - 2 \times dep_a\),最大和最小 \(dep\)。合併時 \(ans = \max(ans_{ls},ans_{rs},ansl_{ls}+maxd_{rs},maxd_{ls}+ansr_{rs})\)\(ansl = \max(ansl_{ls},ansl_{rs},maxd_{ls} - 2\times mind_{rs}),ansr=\max(ansr_{ls},ansr_{rs},maxd_{rs} - 2\times mind_{ls})\)

顯然支援修改,複雜度 \(\Theta((n+q)\log n)\)

相關文章