3nd ucup 部分題目記錄

grass8woc發表於2024-11-27

退役之後一直想著,我至少還是更新一下 ucup 好題和互測好題,但很遺憾一直襬到了現在;論文也還沒有開始施工。

我一直覺得自己如果改掉不良的生活習慣,提高自己的學習效率,完全可以達到更高的水平,但很遺憾我確實戰勝不了自己,我或許永遠都看不到自己的上限了。

馬上就 NOIP/CTT 了。我覺得我起碼得象徵性的訓練一下。我仔細想了想,我還有一個上 LGM 的夢;我是 ucup 隊裡最菜的人,我不想繼續次次在後期擺爛。

那趁我清醒,開始寫點東西吧。

先寫下沒打但是想做的:stage4,stage8

2J. Polygon II

\(n\) 個在 \([0,2^{a_i}]\) 隨機的實數,求它們能圍成多邊形的機率。\(n\le 1000\)

算不合法的機率,那就是列舉最大的邊 \(p\),要求 \(\sum x\le 2x_p\) 。改變一下 \(x_p\) 的定義,重新令其為 \(2^{a_p}-x_p\) ,這樣就得到 \(\sum x\le 2^{a_p}\) 了。

接下來是關鍵的一步: 由於我們只關心 \(\sum x\) 和一個整數的大小關係,那其實可以把 \(x\) 拆成整數部分和小數部分。也就是如果指定 \(x\) 的整數部分,令 \(A=2^{a_p}-\sum [x]\) ,那合法的機率其實就是 \(n\)\([0,1]\) 間隨機的實數加起來 \(\le A\) 的機率,這可以容斥計算。

問題轉化成:計算 \(A\geq 0,A\geq 1,A\geq 2,\dots,A\geq n\) 的機率。

現在 \([x_i]\)\([0,2^{a_i})\) 隨機的整數,發現我們可以進一步拆解:可以看成二進位制下每一位都有 \(\frac{1}{2}\) 的機率為 \(1\) 。最後的計算就是數位 dp 狀物了,從低到高 dp ,記錄下當前 \(\sum x\) 和限制的大小關係,以及往後的進位。複雜度大概是 \(O(n^4\log V)\)

怎麼最佳化呢,由於我們最後只需要計算 \(\sum e_iP(i+\sum [x]\le 2^{a_p})\) 狀物,我們在 dp 的時候只需要在最低位先墊上 \(i+1\) ,最後看第 \(a_p\) 位有沒有進位即可,於是也不需要記與限制的大小關係,答案就是 \(dp_{a_p,0}\) ;又可以發現並不需要列舉 \(p\) ,所以複雜度降為 \(O(n^2\log V)\)

2L. Chords

一個環上 \(2n\) 個點連了 \(n\) 條邊,要取出儘量的邊滿足兩兩不交,資料隨機。

\(n\le 10^5\)

先編出來 \(O(n^2)\) 的 dp ,就是設 \(dp_{i,j}\)\([i,j]\) 內能取多少線段。發現由於資料隨機,答案是 \(O(\sqrt{n})\) 級別的,於是經典的交換狀態和值域,設 \(p_{j,k}\) 是令 \(dp_{i,j}\geq k\) 的最大的 \(i\) ,發現 \(p\) 也是好算的,複雜度 \(O(n\sqrt{n})\)

2I. Mercenaries

\(n\) 個點, \(i\)\(i+1\) 的邊上有若干物品,物品有屬性 \((x,y)\) ;點 \(i\) 上也有一件物品。現在有若干詢問 \(R,a,b,c\) ,你想求出最大的 \(L\) 使得:能從點 \(L\) 到點 \(R\) ,使得取出點 \(L\) 的物品,再在路上每條取一件物品,能使得 \(a(\sum x)+b(\sum y)\geq c\)

\(n,q\le 2*10^5\) ,物品總個數 \(S\le 5*10^5\)

可以發現這個問題一看就很凸包。

建出線段樹,設 \(G_p\) 是節點 \(p\) 內每條邊取一個物品得到的 \((\sum x,\sum y)\) 形成的上凸包;\(F_p\) 是節點 \(p\) 內取一個點為起點,走到右端點的 \((\sum x,\sum y)\) 構成的凸包。令 \(M\)\(mid\)\(mid+1\) 的物品構成的凸包,發現 \(G_p=G_l*G_r*M\)\(F_p=F_l*G_r*M+F_r\) ,其中 \(*\) 是閔可夫斯基和,\(+\) 是求兩個點集並起來形成的凸包。查詢線上段樹上二分即可。

發現每次詢問要對 \(O(\log n)\) 個凸包求出,取一個點 \((x,y)\) 使 \(ax+by\) 最大。考慮把詢問離線下來,把 \((a,b)\) 按極角排序,然後只用對每個凸包維護一個指標即可。複雜度 \(O((n+q+S)\log n)\)

3K. Knocker

這場開始和兩個超級傳奇大師做隊友。

給你一個序列,一次操作能整體模一個數,問最後能得到多少不同的序列。\(n\le 500\)

(記錄官方題解)先來分析終止狀態 \(b\) 合法的條件。不妨對 \(a\) 從大到小排序並去掉相同的位置,接下來觀察 \(b_1\) ,現在不妨設 \(k=b_1-a_1\) ,我們有結論:對於 \(a_i\geq k\)\(b_i\) 一定等於 \(a_i-k\)

只需要證明一步操作後這個條件成立,然後歸納即可。不妨設模 \(x\) 後得到的分別是 \(a'_1\)\(a'_i\) ,那首先有 \(a_1-a'_1\le k\le a_i\) ,於是 \(a_i-a'_i\geq a_1-a'_1\) 。另一方面由於 \(a_i-a'_i=x[\frac{a_i}{x}]\) 。所以 \(a_1-a'_{1}\geq a_i-a'_i\) 。就發現 \(a_1-a'_1=a_i-a'_i\) 了。

回到問題,這裡還有一個條件:\(a_i<2k\) ,一步有效操作後 \(a_1\) 一定會減半。發現這之後直接取模數為 \(k\) ,即可讓 \(a_i\geq k\) 的數都變成 \(b_i\) 了;這也是最優的方法,因為取更小的數後效性更大,取更大的不合法。你發現這樣就不會影響 \(a_i<k\) 的那些數,於是此時遞迴到了一個子問題!只不過我們為了不再影響已經固定了的這些數,會要求之後每次取的模數 \(> b_1\)

於是設 \(dp_{i,j}\) 表示只使用 \(\geq j\) 的模數能得到的不同 \(b_i\)\(b_n\) 個數,轉移列舉 \(k\) 即可。複雜度 \(O(n^3)\)

3B. Breaking Bad

給你一個 \(n*n\) 的矩陣,對於 \(k=0,1,\dots,4\) ,問是否存在排列 \(p\) 使得 \((\sum A_{i,p_i})\bmod 5=k\)\(n\le 1000\)

首先可以想到隨機賦權算行列式,可惜過不了。

(記錄官方題解)

觀察到大多數情況下每個 \(k\) 都是有解的。考慮如果有一個排列滿足能取出不交的四對數 \((i,j)\) ,都滿足 \(a_{i,p_i}+a_{j,p_j}\neq a_{i,p_j}+a_{j,p_i}\) (模 \(5\) 意義下)那就可以透過交換/不交換 \(i,j\) ,對排列進行調整,不難發現一定能調整出所有可能的餘數。

(其實有一個數學上的結論是,對於 \(k\) 個模 \(p\)\(0\) 的數 \((k<p)\) ,它們不同的子集和一定有至少 \(k+1\) 個。)

接下來先找到任意一對這樣的 \((i,p_i),(j,p_j)\) 。事實上去嘗試 \((i,j),(i+1,j+1)\) 就好了,反證易得。如果找不到的話也不難說明此時排列怎麼取,結果都是一樣的:一定存在序列 \(R,C\) 使得 \(a_{i,j}=R_i+C_j\)

接下來直接把 \(i,i+1\) 行和 \(j,j+1\) 列刪掉,繼續找下去,如果最終找到了四對我們就 win 了。否則看一下發生了什麼,設此時找到了 \(q\) 對,發現我們其實就得到一個 \((n-2q)*(n-2q)\) 的子矩陣,滿足 \(a_{i,j}=R_i+C_j\) 。不妨設 \(q=3\) ,把特殊的 \(6\)\(6\) 列提到最前面。接下來直接狀壓 dp:

\(dp_{i,S,h}\) 表示考慮到第 \(i\) 行,關鍵列取了 \(S\) 且當前和為 \(h\) 是否可能。注意這裡算和的時候,我們先把和當成 \(\sum R+\sum C\) ,每次取了一個特殊的格子後就把對應的 \(R,C\) 減去,再把實際值加上即可。複雜度即為 \(O(4^mn)\) ,本題中 \(m=5\)

感覺這場這兩個題都不在我腦洞範圍內啊,大概想一想,K 是找到了判定過程中的子問題,從而設計 dp;B 是觀察到了難搞的情況形式很好看,於是也不難搞了。

5J. Prefix Divisible by Suffix

問你 \(n\) 以內有多少數滿足:把十進位制寫出來,能夠把它劃分成兩段 \(p,q\) ,使得 \(q+c|p\) ,其中 \(c\) 是給定常數。\(n\le 10^{14},c\le 10^4\)

發現自己其實一眼就會了,只是不敢剪枝。考慮直接列舉最低的 \(7\) 位,發現此時我們對 \(n\) 提出來若干限制 \((p,c)\) 表示:若模 \(p\) 餘數為 \(c\) 就一定合法了。對這些限制容斥,這樣就得到了一個算量 \(20^{7}*\log V\) 的做法。(需要解 CRT)

但自己想想,算量真的會那麼大嗎?可以發現指定容斥的集合,其模數的 lcm 很有可能很大,於是容斥的時候直接搜尋要欽定的集合,lcm 太大了就剪掉。然後就能透過了。。挺沒意思的。

5C. Painting Fences

給你一個網格,給出每個格子開始的顏色(黑/白),一次操作可以選一條與 x/y 軸平行的直線對網格翻折,對於重合的兩個格子,如果一個為黑的話可以把另一個也染黑。求出使得所有格子變黑的最小次數。\(n\le 1000\)

倒著來看這個過程,於是發現起作用的其實只是一個全黑的子矩形,設 \(f_{l,r}\) 是假設這個矩陣是 \(1*n\) 的,且 \([l,r]\) 為黑那需要操作多少次,\(g_{l,r}\) 同理為矩陣長為 \(m\) 時的次數。則可以發現一個子矩陣需要的運算元就是 \(f_{xl,xr}+g_{yl,yr}\)

列舉 \(xl,yl\) 。一個一開始就能做出的觀察是答案很小,具體的發現:\(f_{l,r}\) 的大小都是 \(O(\log n)\) 級別的,所以求出 \(p_{l,i}\) 表示最小的 \(r\) 使得 \(f_{l,r}\le i\)\(q_{l,i}\) 同理。於是只需要列舉 \(xr=p_{xl,i},yr=q_{xr,j}\) 看看是否合法即可。這裡可以雙指標,複雜度 \(O(n^2\log n)\)

7E. Express Eviction

給你一個 \(n*m\) 的網格圖。有一些格子存在障礙,障礙可以 ban 掉它周圍的四個頂點。現在你想知道:至少要移除多少障礙,才能從 \((0,0)\) 走到 \((n,m)\)

先想想如果已經知道哪些點被 ban 了該怎麼判斷,發現其實就是,如果存在 \(x=0/y=m\) 的點與 \(x=n/y=0\) 可以透過 ban 掉的點八聯通起來,那就寄掉了。

進一步可以發現,確定障礙後寄掉的條件其實就是: \(x=1/y=m\) 的某個障礙可以走到 \(x=n/y=1\) 的障礙,其中每一步只能走到 \(x,y\) 之差都不超過 \(2\) 的障礙,證明比較容易。

對著這個做最小割就好了。

7C. Price Combo

很牛的一個題,先咕了。

10H. Intersection of Paths

給定一棵有邊權的樹,詢問:臨時修改一條邊的邊權,然後給定 \(k\) ,求出取 \(k\) 條端點不重合的路徑,交的邊權和的最大值。\(n,q\le 5*10^5\)

取重心為根,發現如果存在一組方案的交會包含 \(u\)\(v\) 的路徑,就等價於 \(sz_u,sz_v\geq k\) ,於是如果沒有修改邊權的事情,我們就只用求出 \(sz\geq k\) 的點中距離最遠的兩個點。

現在有邊權修改,怎麼處理,我們其實只需要求出刪掉這條修改的邊後,兩個子樹分別的直徑即可。注意到這個直徑的端點要麼是葉子,要麼是刪掉的邊的端點,那我們考慮把 \(k\) 相同的詢問放到一起處理,將保留 \(sz\geq k\) 的點後得到的樹的葉子拎出來,容易發現它們只會有 \(\frac{n}{k}\) 個,每次詢問相當於查一段區間的點的直徑,線段樹處理就可以平衡。複雜度 \(O((n+q)\log n)\)

冷靜一下,其實這樣處理煩了,我們把詢問按 \(k\) 從大到小排序,這樣只需要維護線段樹,要求每次啟用一個點,以及查詢一個區間啟用的點的直徑即可。複雜度仍是 \(O((n+q)\log n)\)

LOJ177 生成子群階數

給你 \(m\) 個長度為 \(n\) 的排列,問你它們能複合出多少不同的置換,其中每個排列都能用若干次。\(n,m\le 50\)

發現還不會這個東西,學一下。

首先可以把給定排列的逆也加進來,因為設其環長 lcm 為 \(L\) ,其實逆就可以表示成原來的排列複合 \(L-1\) 次。

考慮建出一張圖,對於一個給定的排列,對任意 \(1\le i\le n\) ,我們從 \(i\) 連向 \(p_i\) ,這樣一組操作可以看做是從 \(1\) 開始的一條路徑,途中會複合上所有經過的置換。可以發現這裡走到的點就代表當前 \(p_1\) 的值。

現在先求出以 \(1\) 為根的生成樹,設終點為 \(t\) ,那對於 \(1\)\(t\) 的任意一條路徑,考慮在走到 \(t\) 之後,沿著樹邊走回 \(1\) ,再走到 \(t\) ,可以發現這樣效果是不變的,於是終點為 \(t\) 的路徑一定都形如:從 \(1\) 出發走回了 \(1\) ,再按照樹邊走向 \(t\)

就可以得到一個結論,方案等於:\(p_1\) 可能的取值數 ,乘上 \(p_1=1\) 的方案數。

繼續思考對於一條走回 \(1\) 的路徑 \(1\rightarrow u_1\rightarrow u_2\dots \rightarrow u_k\rightarrow 1\) ,它和 \(1\rightarrow u_1\rightsquigarrow1\rightsquigarrow u_1\rightarrow u_2\rightsquigarrow 1 \rightsquigarrow u_2\rightarrow u_3 \rightsquigarrow 1\dots \rightarrow u_k\rightarrow 1\) 是等價的。其中 \(\rightsquigarrow\) 是在走樹邊。

於是得到結論:\(p_1=1\) 的排列都可以透過將 \(1\rightsquigarrow u\rightarrow v \rightsquigarrow 1\) 得到的排列複合得到。

這樣做的好處是,我們可以用的置換都滿足 \(p_1=1\) ,於是可以遞迴到 \(n-1\) 的子問題繼續做。但問題是我們建出的圖有 \(nm\) 條邊,也就是說子問題裡 \(m:=nm,n:=n-1\) ,這顯然就炸掉了。結論是,我們只需要把這 \(nm\) 個置換先改造成 \(O(n)\) 個,改造的方法是,我們進行隨機,在這些置換中隨機選擇一個子集,將內部的置換複合起來,這樣隨 \(O(n)\) 次,把每次隨機得到的置換給遞迴下去。

複雜度 \(O(n^5)\) ,瓶頸在於要做 \(O(n^2)\) 次隨機複合的過程 ,每次期望會複合 \(O(n^2)\) 個排列,單次複合是 \(O(n)\) 的。

11J Again Permutation Problem

只需要把 LOJ177 的答案和 LOJ4127 的答案乘起來就好了。

回顧一下 LOJ4127 的做法,其實發現這裡分析的方法是類似的,我們仍然先把排列的逆加進來,然後建立一張 \(n^2\) 個點的圖,對於一個給定排列我們在點 \((i,j)\) 和點 \((p_i,p_j)\) 間連邊。這樣有結論是:若 \((i,j),(a,b)\) 聯通則 \(p_i=a,p_j=b\) 的方案數等於 \(p_i=i,p_j=j\) 的方案數。證明是和上面那個題的證明基本一致的。

於是算逆序對的期望只需要列舉 \(i<j\) ,記與 \((i,j)\) 聯通的滿足 \(a<b\) 的點數為 \(x\)\(a>b\) 的點數為 \(y\) ,那貢獻其實就是 \(\frac{y}{x+y}\) 了。更直接的,就是對每個聯通塊計算 \(\frac{xy}{x+y}\) 的和。

11F Train Seats

題意是有一些椅子,每次可以拿走一個椅子,代價是離它最近的兩把椅子的座標差(若左邊沒有則為 \(0\) ,右邊沒有則為 \(m+1\)) 。讓代價的和最大。\(n\le 2*10^5\)

\(a\) 排序,設 \(b_i=a_{i+1}-a_i\) (令 \(a_{n+1}=m+1\)),則一次操作相當於合併 \(b_i,b_{i+1}\) ,代價為 \(b_i+b_{i+1}\) ,最後讓代價最大。建一棵二叉樹來刻畫這個過程,然後我們有結論:不可能有一個點的兩個兒子都是非葉子。證明就考慮四個數 \(x,y,z,w\) ,我們相當於要證明:先合併 \((x,y),(z,w)\) ,再合併 \((x+y,z+w)\) 一定不優。原因考慮此時代價是 \(2(x+y+z+w)\) ,而從左往右依次合併的代價是 \(3x+3y+2z+w\) , 從右往左是 \(x+2y+3z+3w\) 。把都有的東西減掉,發現 \(\max(2x+y,z+2w)\geq \frac{2x+2w+y+z}{2}\geq x+w\)

那其實就可以看到我們只有兩種可能:要麼合併好 \([2,n]\) 再把 \(1\) 合併進來,或者合併好 \([1,n-1]\) 再把 \(n\) 合併進來。也就是說,每次會刪掉 \(b\) 的開頭/結尾,代價是當前剩餘的長度乘上選擇的數。

直接使用 qoj2070 的程式碼即可。大概思路就是列舉最後保留的位置 \(k\) ,那就是對一棵只有兩條鏈的樹做 exchange argument,利用線段樹來合併兩側已經出現的連續段即可。

11O New School Term

差點把我們隊逮捕了的題。

題意是有一個 \(2n\) 個點的無向圖,你需要選擇一個邊集,使得能黑白染色且 白點個數=黑點個數 的前提下,使選擇的邊的 \(\sum 2^{編號}\) 最大。

\(n\le 5000,m\le 10^6\)

從大到小嚐試加入每條邊,先看一下加入後怎麼判斷合法。

用擴充並查集判能不能黑白染色:如果 \(u\)\(v\) 在一個聯通塊就寄了;如果 \(u\)\(v+2n\) 已經在一個聯通塊,那不會影響,直接加進來即可。

否則我們連上這條邊來嘗試,發現其實對每個聯通塊求出黑-白之後做一個揹包就好了。

這裡我們任意設立一個模數變成算方案,這樣的好處是可以支援刪除物品。

接下來更新並查集,如果可以連的話,自然就合併 \((u,v+2n),(v,u+2n)\) ;否則你發現 \(u,v\) 一定同色,於是合併 \((u,v),(u+2n,v+2n)\)

這樣每次做嘗試都會讓聯通塊個數減少,於是複雜度 \(O(n^2+m)\)

相關文章