第二屆全國大學生算法設計與編程挑戰賽(秋季賽)正式賽題解&比賽回顧


前言

很幸運地拿到了 rank 1!感謝主辦方老板(

這次 rank 1 就是實力碾壓了,隊友負責寫牛逼題我負責寫傻逼題。

比賽回顧

咕咕咕

題解

題解會盡量照顧到所有水平的選手,會很通俗易懂

這次有些題是隊友寫的,於是我給的題解不一定描述的很清楚,這里給出甩鍋名單,看不懂請找做這個題的人。

ACEFG by me
DHI by shygo_cmll01
BJK by pigstd

如果我沒更新記得私信/QQ催我!

Overall

題目編號 A B C D E F G H I J K
思維難度 8 1 2 0 2 0 3 3 4 0 6
實現難度 8 2 3 2 1 0 2 3 4 0 8

所有難度均從 \(0\)\(10\) 打分。

Problem A 分組

重題 Codeforces 755G。

值得一提的是這里開大數據范圍卡掉了倍增 FFT 的垃圾做法。

代碼

Problem B 二進制

題面 你需要維護 $k$ 棵線段樹,支持其中一個子集的區間加和查詢一個子集的區間和之和。

\(n,q\leq 10^5\)\(k=10\)

題解 根據題意暴力對每棵線段樹操作即可。

時間復雜度 \(O(k(n+q)\log n)\)

代碼

Problem C 不正方形

題面 給 $n$ 個紅點,$m$ 個藍點,問是否存在一個凸四邊形使得相對頂點顏色相同。

\(n,m\leq 250,x_i,y_i\leq 10^7\)

題解 問題等價於是否存在一條紅點之間的線和藍點之間的線相交。

暴力判斷的時間復雜度為 \(O(n^2m^2)\),不能通過。

考慮如果某條紅點組成的線和藍點組成的線有交,顯然紅點組成的線和藍點組成的凸包有交。

而如果紅點組成的線和藍點組成的凸包有交,顯然紅點組成的線和藍點組成的線也一定有交。

直接每條線和凸包求交即可。

時間復雜度為 \(O(n^2m)\),可以通過一些技巧優化。

代碼

Problem D 分配顏色

題面 有 $n$ 行 $m$ 列矩陣,$p$ 次將任意行取反,$q$ 次將任意列取反,問最后共 $t$ 個元素被取反的方案數量有多少,對一個非質數取模。
題解 考慮通過 dp 算出用 $i$ 個操作將 $j$ 行/列取反的方案數,最后枚舉取反的行數和列數即可。

時間復雜度 \(O(np+mq+nm)\)

代碼

Problem E 土地規划

題面 有一個二維平面,第 $1$ 時刻 $(0,0)$ 會變成紅色。

對於之后的每個偶數時刻,如果存在 \((x-2,y)\)\((x-1,y-1)\) 一個染紅色,一個沒有染色,\((x,y)\) 就會被染成藍色。

對於之后的每個奇數時刻,如果存在 \((x-2,y)\)\((x-1,y-1)\) 一個染藍色,一個沒有染色,\((x,y)\) 就會被染成紅色。

\(T\) 個時刻后某個矩形中的所有點的顏色。

\(T,x,y\leq 10^{12}\),矩陣邊長 \(d\) 不超過 \(50\)

題解 首先觀察到性質:第 $i$ 次染上的點的 $x,y$ 坐標之和一定是 $2i$,證明可以使用歸納法。

因此,染色的過程就是向右上一層一層撒點的過程。

注意到兩個中恰好一個的條件可以看作奇偶性,於是我們直接轉化條件為 \((x,y)\) 的權值等於 \((x-2,y)\)\((x-1,y-1)\) 的權值和,求每個位置的權值和奇偶性。

不難發現這樣就是一個楊輝三角,即求組合數奇偶性了,我們可以使用盧卡斯定理或者一個經典結論完成。

時間復雜度 \(d^2\)\(d^2\log(x+y)\)

代碼

Problem F CTF

題面 你在前 $2^1$ 天會每天寫 $1$ 題,接下來 $2^2$ 天每天寫 $2$ 題,接下來 $2^3$ 天每天寫 $3$ 題,以此類推,問你前 $n$ 天會寫多少題。

\(n\leq 10^7\)

題解 考慮直接暴力枚舉每天寫 $i$ 題的日子為 $[l_i,r_i]$,和 $[1,n]$ 取交集加入答案,當 $l_i>n$ 時直接跳出即可。

時間復雜度 \(O(\log n)\)

代碼

Problem G 希望

題面 有兩棵 $n$ 個點的樹,編號都為 $1\sim n$,隨機一個排列 $p$,將 $i$ 與 $p_i$ 連邊,求長度為 $m$ 的簡單環的數量的期望,保留四位小數。

\(n\leq 300\)\(3\leq m\leq 7\)

題解 顯然環一定形如從 $x$ 走樹邊到 $y$,走 $i\to p_i$ 的邊到 $p_y$,走樹邊到 $p_x$,走 $p_i\to i$ 的邊回到 $x$,因為每個環出現的概率都是 $\frac{2}{n(n-1)}$,於是數環的數量即可。

於是直接枚舉四個點就可以算這個環是否合法了,預處理兩點之間距離后時間復雜度為 \(O(n^4)\),不能通過。

事實上兩步枚舉可以分開,預處理兩棵樹上距離為 \(d\) 的路徑的數量即可。

時間復雜度 \(O(n^2)\)

代碼

Problem H 只有小A受傷的世界完成了

題面 一條直線上有 $n$ 個點,所有點對之間連邊,一開始所有邊從左向右連。

\(m\) 次操作,每次給出一條線段,如果兩個點都在線段內就反轉這兩個點之間的邊的方向。

問所有操作結束后存在幾個有向三元環。

\(n,m\leq 10^5\)\(a_i\leq 10^9\)

題解 對於三個點 $(x,y,z)$,它們 不能形成三元環當且僅當某兩個點向第三個點連邊的方向相等 。

所以枚舉 \(x\),求出 \(y,z\)\(x\) 連邊方向相同的點對數量即可,這個問題可以使用線段樹加掃描線維護。

時間復雜度 \(O(m\log n)\)

代碼

Problem I 排隊隊

題面 有 $n$ 個人,每個人有屬性 $a_i,p_i,q_i$。

\(n\) 個人排隊,如果一個人前面的人和他的 \(a_i\) 一樣就有 \(p_i\) 的貢獻,不然就有 \(q_i\) 的貢獻,問所有人的貢獻之和的最大值。

\(n,a_i\leq 5\times 10^5\)\(p_i,q_i\leq 2000\)

題解 先考慮每個人和前面的 $a_i$ 都一樣,這樣顯然是 $\sum p_i$ 的貢獻。

然后考慮將若干個 \(p_i<q_i\) 的人進行調整,使他們的 \(a_i\) 和前面的人相同並更新貢獻。

\(a_i=x\)\(i\) 的數量超過 \(\frac{n}{2}\) 時,需要一些技巧來處理細節。

時間復雜度 \(O(n\log n)\)

代碼

Problem J 抽獎

題面 你有 $x$ 個原石和 $0$ 個星輝,每 $160$ 個原石或者 $5$ 個星輝可以抽一發,每抽 $10$ 發會得到 $3$ 個星輝,問你能抽多少發。

\(x\le 10^8\)

題解 先把原石全抽完,最后不斷抽完星輝再根據累計抽獎數量更新星輝數量即可。

顯然你的星輝數量每次以對數級減少。

時間復雜度 \(O(\log x)\)

代碼

Problem K 樹

題面 給你一個有邊權的樹,求一個字典序最小的排列 $p$ 滿足 $\sum _{i=1}^ndis_{i,p_i}$ 最大,輸出答案和排列。

數據范圍 \(n \le 10^5\)

題解 一個顯然的上限是對於每條邊 $(u,v,w)$,那么這條邊的貢獻最大是 $w \times t$,其中 $t$ 為這條邊兩邊的點數的最小值,並且不難直接構造出一個排列滿足條件,但是此題要求字典序最小。

找出數的重心並且以其為根,定義一個數 \(u\) 的顏色 \(c_u\) 表示 \(u\) 的深度最小且不為根的祖先,特別的有 \(c_{rt}=rt\),那么顯然不能有 \(c_{p_i}=c_i(i \ne rt)\),並且滿足上述條件即可取到最大值(顯然)。

那么就先貪心的取數,一開始可以直接隨便選,當取到一種顏色需要刪掉的次數等於別的顏色需要刪掉的次數(每個點要刪兩次)的時候就不能隨便選了,必須要一一對應,否則就會出現上述矛盾的情況,刪除等操作使用一些簡單的數據結構和 dfs 序維護即可,細節較多。

代碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM