CCC2019游記


好吧其實是清華游記,$CCC2019$ 在中國只有北京和天津舉辦,要選去加拿大的人很少,估計是最近兩國關系有點緊張的緣故吧

但實際上是某些已經被清華欽點的人去預覽一下他們未來的棲息所


$13:30$ 到了清華(門口的保安都好高端啊,手臂上都有“清華門警”標志),發現清華計算機系大樓里的通道都挺神秘的,兩邊的研究房(其實跟學生的辦公室差不多)也好高級……我只記得第一個好像叫“下一代互聯網研究中心”,別的記不清了。

先去樓上聽了不知道哪個清華老師的詐騙招生講解。

老師的講解也比較溫和催眠(全場大部分聽着聽着就睡着了),列舉了一下清華在計算機系的各個成就以及世界排行,包括 $AI$、系統等方面。名次你知道的

列舉了很多排名,講講清華招生政策,並且鼓勵在場的幾十個同學早日來到清華研究學習

其實老師完全可以不用吹那么多,或者不說,全場都會自動被詐騙去清華的(說的不錯,tm考得上嗎)

吹完了,下樓去聽另一個老師講講 $IPV6$ 相關的知識。

雖然 $IPV6$ 有 $2^{128}$ 個地址($2^{64}$ 已經是個天文數字了),而且 $IPV6$ 不分公網私網,但目前 $IPV6$ 在國內沒有普及,重要原因貌似就是 $IPV4$ 和 $IPV6$ 不兼容,也就是 $IPV4$ 地址的網站不能轉用 $IPV6$ 打開,目前還在抓緊研究兩種地址間的翻譯技術(當然還有其它原因)。


然后就早早地去 $CCC2019$ 考場了。那個機房是一個不知道該怎么形容的弧狀,反正就是清華風格吧。

聽說加拿大出的題很有 $CF$ 風格?不管,反正我要浪到考試。(考后我才知道根本不是加拿大的題,是清華的人自己出的選拔題,$T2$ 和 $T4$ 甚至是我們大哥出的)

然后到考前 $10$ 分鍾的時候我發現我忘了 $linux$ 的終端命令怎么寫了(誰閑的蛋疼天天用 $linux$),那里的 $linux$ 里沒裝 $guide$ 之類的可以直接編譯、運行程序的編程軟件,只給了類似於 $visual\space studio\space code$ 之類的文本編輯工具。

然后發現清華大哥在旁邊,我就詢問了一波……

(大哥:你真該挨板子啊,基礎操作都忘了)

不過只能終端編譯、運行程序還是不太習慣。

 

$16:00$ 上清華內網打開題,全是英文,都沒人志願翻譯一下的,$tzsl$。

 

$T1$ 題意:給你一個字符串,讓你輸出 刪掉字符串中所有出現次數小於 $k$ 的字符后的字符串。

模擬題(woc這種題就不應該開終端編譯的)

果然是 $CF$ 風格?前面的題很水?

 

$T2$ 的英文 $non-negative$ 我忘了什么意思,猜了半天,猜想是無符號(就是非負)。

題意:給你一個二進制完全平方數,輸出其開平方根后的二進制數。$90\%$ 的數據二進制數長度 $|n|\le 3000$,$100\%$ 的數據 $|n|\le 100000$。

首先能想到二進制轉十進制,直接開 $int$ 數的平方,然而這樣貌似只能拿 $30\%$ 的分。

然后又看了一下滿分數據,$1e5$ 的數據,想了想,按照 $CF$ 風格,這題應該就是到智力題吧?

然后推了半個小時弱智結論,寫了一發,並不對,白忙活了。

只好回頭考慮 $90$ 分

二分答案?然而高精度二分不是很蠢嗎……復雜度大概是 $O(|n|^3)$ 的樣子(沒仔細思考),$60\%$ 的分。

其實不難發現 高精度二分只要從高到低枚舉每一位是 $1$ 還是 $0$ 即可,二進制基礎知識。

對於枚舉的一個二進制位,如果設其為 $1$ 后比給定的數大,就把這位設為 $0$,否則設為 $1$。

把一個二進制數修改一位后再求其平方,朴素暴力的時間復雜度是 $O(|n|^2)$ 的,套外面的枚舉 $|n|$ 個二進制位,復雜度 $O(|n|^3)$。

仔細思考一下,把這個數的平方列成乘法豎式,自己乘自己,其實可以在之前的平方結果的基礎上 $O(|n|)$ 修改,得到新的平方結果。總時間復雜度 $O(|n|^2)$。

所以養眼+養生磨蹭了不少時間才寫完 $90$ 分。滾去看 $T3$ 了。

 

$T3$ 題意:給你一個環,長度 $n\le 262144$,環上依次排列 $n$ 個數,每次可以把相鄰的兩個相同的數合並成一個新數(第 $n$ 個數和第 $1$ 個數相鄰),新數的值為合並前的任意一個數 $+1$。所有數的值 $\le 40$。讓你設計合並方案,使最后環上的最大數最大(“最后”指環上沒有能合並的相鄰兩數 或者環上只剩一個數)。

考試的時候看到數據范圍以為是個貪心(比較菜),於是寫了個優先隊列合並區間……

然后調試的時候(大概 $18$ 點整左右),我和旁邊幾人的電腦突然斷電了……$tzsl$

監考員(大學生)去重開電閘后,有兩個人的電腦重啟了兩次后就打開了,然而我和另外一人的電腦就崩壞了……

算算也浪費 $5$ 到 $10$ 分鍾了,監考員說會給我們加時,然后先讓我們坐旁邊電腦了。

監考員通過安全模式幫我把 $T3$ 的代碼發了過來,然而我在這段時間里證明了這個做法是錯的,因為並不能朴素地優先隊列合並區間。

比如一個環上有 $1\space 1\space 1\space 1\space 2\space 2$ 六個數,正確答案應該是先合並第一、二個 $1$ 或第三、四格 $1$,答案應該是 $3$,但有可能采用合並的數相同卻不正確的策略,比如先合並第二、三個數,這時最大就只能弄出 $2$ 了,顯然不對。

其實可以附加一些策略來修正以上問題,但是代碼好像很喪心病狂,考場寫出來並不太合理,於是就跳了這題。

 

$T4$ 題意:

有一個神奇的式子$$(\sqrt{2}+\sqrt{3})^n+(\sqrt{2}-\sqrt{3})^n+(-\sqrt{2}+\sqrt{3})^n+(-\sqrt{2}-\sqrt{3})^n$$

這個式子中的每一項都可能不是整數,甚至不是有理數,但四項的和一定是個整數。題目並沒有給出證明(就算給出證明估計也會因為不通英文而看不懂)。

不僅如此,其推廣出來的式子也滿足這個性質 $$\sum{(\pm\sqrt{a_1} \pm\sqrt{a_2} \pm\sqrt{a_3} ... \pm\sqrt{a_m})^n}$$

你的任務是給你 $n,m$ 和 $a_1$ 到 $a_m$,求出上式的結果膜 $10^9+7$。

$n,a_i\lt 10^9+7,\space m\le 7$

顯然不能暴力,因為中間過程全是小數運算,而小數並不能取膜。

考試的時候沒怎么想這題, 看到 $10\%$ 的數據中 $m=1$,於是直接做了 $10$ 分滾去看 $T5$ 了。

 

$T5$ 的英文有點硬核,我理解了半天才弄明白題意:

有一棵帶權無根樹,$n$ 個點從 $1$ 到 $n$ 編號。初始時有從 $1$ 到 $n$ 編號的 $n$ 個點集,第 $i$ 個集點集只有 $i$ 號點。

接下來有 $n-1$ 次操作,每次操作給你兩個數 $a,b(a\lt b\lt n+i)$,然后生成一個編號為 $n+i$ 的新點集,其內容為編號為 $a,b$ 的兩個點集的並。

保證編號為 $n\times 2-1$ 的點集恰好包含樹上 $n$ 個點各一次。

對於生成出來的 $n-1$ 個點集,判斷每個點集中是否有在原樹上距離至少為 $k$ 的點集($k$ 全局不變),輸出 $0$ 或 $1$。

$30\%$ 的數據中 $n\le 200$, $60\%$ 的數據中 $n\le 2000$, $100\%$ 的數據中 $n\le 100000$。

注:點集是集合,有互異性,即點集中不會有同一個點出現兩次。

從前往后掃部分分,很快想到了 $20\%$ 數據的做法。但因為考試策略不當,准備寫的時候已經只剩 $5$ 分鍾了……其實本來還有 $10$ 分鍾左右加時,不過我出於某些考慮並沒用(包括這考試沒什么用,只取前 $2$ 名去加拿大參加比賽,其余人連個證書都沒有),所以沒寫完這題。

 

算了一下,這比賽應該差不多是省選難度?然而 $3$ 小時就拿了 $200$ 分……如果用加時的話可能 $5$ 分鍾大概就能寫完第 $5$ 題前 $20$ 分,那也就 $220$ 分,還是菜。

 

出了考場后發現 兩位 $GD$ 神爺一個 $390$ 一個 $400$ 吊打一群人……

據說是做過 $T3$ 原題……那神仙題我等蒟蒻都不會啊……

然后剩下的人好像也都考得並不理想,除了饅 $god$ 切了 $T5$ 拿了 $300$ 分以外,再其他人最高好像就 $200$ 分了……並不知道發揮情況

$T2$ 最后 $10$ 分是出題人(大哥)防 $AK$ 的,實際上出題人自己都沒想到多項式時間的做法。有一種可能可行的方法:二分答案套 $FFT$ + 壓位(那個 $FFT$ 其實就是為了快速做大乘法,也就是平方),壓位要把每一位開 $long\space long$ 因為每一位要存 $30$ 個左右二進制數,復雜度大概就是 $O(\frac{n\times log(n)}{30})$。注意一下不用 $NTT$,模了高精度數的其中一位還會錯(你並不能在 $NTT$ 中借取模實現進位),列乘法豎式的時候先不進位,最后統一從低往高進位即可。

$T3$ 就是一個狀態偏僻(想不出來)的區間 $dp$ 變形。我們知道,在區間 $dp$ 時,一般左、右端點(或左端點和區間長度)各占一維狀態,但如果區間特別長(比如 $1e5$ 級別長度),這樣存顯然爆空間,但我們可以觀察一下 $dp$ 數組存的值,如果值很小,我們可以將 $dp$ 值與 $dp$ 的一維狀態交換,從而降低復雜度。這題同理,由於初始時所有數都不超過 $40$,所以即使初始時所有數都卡滿 $40$,最大也只能合出來 $40+\lfloor log(n_{max})\rfloor$,不到 $60$。

把環拆成二倍鏈。設 $dp(i,j)$ 表示使第 $i$ 個數變為 $j$ 時,最少要向右合並多少個數(只能向右)。轉移方程大概是 $dp(i,j)=dp[i+dp(i,j-1),j-1]$(我靠有了狀態后轉移真好想),注意特判一下 $dp$ 值不能 $\ge i+n$,這種情況下不能更新。

$T4$ 是個比較短的矩陣快速冪(但不會推式子)。簡單的說個例子:看看樣例,會發現式子的每一項無論求多少次冪,都可以只用 $1,\sqrt{2},\sqrt{3},\sqrt{6}$ 這四種系數表示,所以可以以系數為橫軸,$n$ 為縱軸建個矩陣,簡單的話就是暴力轉移,進階一點就是矩陣快速冪。

$T5$ 考后想想其實是個傻逼題……非常結論……$WZJ$ 還講過(我還記得)……只不過沒時間思考了…… 首先前 $50$ 分都可以暴力地合並兩個點集;然后 $20\%$ 的數據就是暴力兩兩配對兩個集合中的點,看有沒有距離超過 $k$ 的點,快速求兩點距離的話可以寫 $O(1)$ 求 $LCA$ 后求兩點與 $LCA$ 的深度差,也可以直接 $O(log(n))$ 倍增求;$50\%$ 的數據,可以暴力合並出新集合后,$O(n)$ 求新集合的最長鏈(就是從任選的一個根節點出發求兩次最遠點)。

滿分的話,就不能每次暴力合並兩個點集了。如果不合並,又要快速求出一個點集的最遠點(也就是最長鏈),就考慮一下能否只記一個點集的最遠兩點(即最長鏈的兩端)。事實上有這么個結論,就是合並兩棵樹,新樹只有六種最長鏈,即原來兩棵樹的兩條最長鏈的四個端點中任選兩條相連,具體證明這里不贅述了。總之記住這樣一個結論,這題挺裸的……但放到第五題確實很想噴,哪怕根第二題交換一下也能接受。


考完后找這個那個理由,說沒看見 $T2$ 的 $90$ 分部分分之類的話有什么用呢?$HX$ 老爺不是說了部分分要從前往后看嗎?

這風雨飄搖一程究竟還有多遠?


免責聲明!

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



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