前言
很幸運地拿到了 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 序維護即可,細節較多。