NCTU PCCA Winter Contest 2021 個(gè)人題解

比賽鏈接:https://codeforces.com/gym/102946
官方題解:https://hackmd.io/@HNO2/HJTOKCOe_
難度:3星


A. A Water Problem
題意:給定一個(gè)數(shù) ,求
的各位數(shù)字之和與
本身的乘積。
題解:按題意計(jì)算即可。
B. Bongcloud
題意:給定一個(gè) 01 矩陣,求上下對(duì)稱的子矩陣有多少個(gè)。
題解:對(duì)于每列使用一次馬拉車算法,求得以每個(gè)位置為中心,上下拓展的最長(zhǎng)回文串長(zhǎng)度。對(duì)于某一行,我們將以各位置為中心的最長(zhǎng)回文串描出對(duì)應(yīng)方格,得到如下的圖。

如上圖,以藍(lán)色行為對(duì)稱軸,且范圍在黑色方格內(nèi)的子矩形一定滿足條件。對(duì)于每條對(duì)稱軸,求出這樣的子矩形有多少個(gè)即可。根據(jù)對(duì)稱性,我們可只關(guān)注對(duì)稱軸的一側(cè)。

問(wèn)題便可轉(zhuǎn)化為,求以每個(gè)藍(lán)色方格作為右下角的矩形有多少個(gè)。以最右側(cè)藍(lán)色方塊為例,滿足條件的矩形范圍落在下圖的黃色區(qū)域中,以該藍(lán)色方塊作為右下角的矩形個(gè)數(shù)實(shí)際上就是區(qū)域中的方格數(shù)。

而這樣的區(qū)域一定是一個(gè)單調(diào)上升的區(qū)域,因此我們?cè)趶淖笙蛴颐杜e這些位置時(shí),用一個(gè)單調(diào)棧維護(hù)這樣的區(qū)域即可。時(shí)間復(fù)雜度 。
C. Chicken Nuggets
題意:給定一個(gè)樹(shù),各點(diǎn)有一個(gè)點(diǎn)權(quán)。如果一個(gè)點(diǎn)被去掉,則與之相連的邊也會(huì)被去掉?,F(xiàn)需要去掉一些點(diǎn),使得剩下的各點(diǎn)與之相連的邊數(shù)都為奇數(shù),求剩下各點(diǎn)的點(diǎn)權(quán)和最大是多少。
題解:定義狀態(tài) ,表示以
為根的子樹(shù),點(diǎn)?
去掉/保留,點(diǎn)
的度數(shù)為偶數(shù)/奇數(shù),該狀態(tài)下點(diǎn)權(quán)和的最大值。最初,
,
,
(
是不可能出現(xiàn)的狀態(tài))。然后像背包 dp 一樣,將?
的各個(gè)兒子放入背包中。假設(shè)將?
的兒子?
放入背包前,
的各個(gè) dp 值為
。此時(shí)將
放入背包中,有:
最終答案為 ,時(shí)間復(fù)雜度
。
D. Discombobulator 3000
題意:交互題?,F(xiàn)有兩個(gè)數(shù)列 和
,兩者都為?
到?
的排列,且?
為?
循環(huán)右移?
位的結(jié)果。每次詢問(wèn)兩個(gè)值
,可以得到
。在詢問(wèn)次數(shù)不超過(guò)?
的條件下,求得
。
題解:詢問(wèn) ,得到的結(jié)果中若只有一個(gè)
,則
。若有兩個(gè)
,即
,則再詢問(wèn)
。若
,說(shuō)明
,否則說(shuō)明
,據(jù)此得出
。詢問(wèn)次數(shù)最多為
。
E. Evenly Distributed
題意:定義一個(gè)數(shù)集可以被均分,表示存在一種方案將這個(gè)數(shù)集分為兩個(gè)集合,使得這兩個(gè)集合中數(shù)的和相等?,F(xiàn)要求夠造一個(gè)含? 個(gè)正整數(shù)的集合,這?
個(gè)數(shù)的和為
,且這個(gè)集合的任意一個(gè)子集都不能被均分。
題解:貪心,每次把能放入集合中最小的數(shù)放入集合,那么依次放入集合的數(shù)為 ,可以發(fā)現(xiàn)正好都是?
的冪次。按照貪心的思路,先在集合中放入
,那么最后需要放入的則是?
。而最后放入的數(shù)應(yīng)當(dāng)大于
,也就是說(shuō)如果
,即
,那么滿足條件的構(gòu)造方式便是不存在的。
F. Fishy Study
題意:有一個(gè)魚(yú)塘,以? 行?
列的 01 矩陣表示,
表示該位置一開(kāi)始沒(méi)有魚(yú),
表示該位置一開(kāi)始有魚(yú)。同時(shí),魚(yú)塘中某個(gè)位置還有一個(gè)海膽。每一天,魚(yú)塘中依次發(fā)生如下變化:
海膽會(huì)往上、下、左、右中可移動(dòng)的方向移動(dòng)一格。
對(duì)于每個(gè)位置,如果海膽在該位置,則該位置這一天沒(méi)有魚(yú);否則,如果該位置前一天有魚(yú),且周圍八個(gè)格子中有?
或?
條魚(yú),則該位置這一天有魚(yú);否則,如果該位置前一天周圍八個(gè)格子中有?
條魚(yú),則該位置這一天有魚(yú);否則,該位置這一天沒(méi)有魚(yú)。
給出魚(yú)塘的初始狀態(tài),并給出一個(gè)理想狀態(tài),問(wèn)? 天內(nèi)該魚(yú)塘是否可能出現(xiàn)理想狀態(tài)。
題解:魚(yú)塘的最終狀態(tài)其實(shí)只與海膽的移動(dòng)路線有關(guān)。由于? 最大為
,海膽的移動(dòng)路線最多有?
種,爆搜即可。我的代碼中使用了 bitset 存儲(chǔ)狀態(tài),需要注意下標(biāo)的區(qū)別。
G. Group-Theoretic Machine
題意:給出三維空間里的六個(gè)點(diǎn) ,其中
平行于 x 軸,
平行于 y 軸,
平行于 z 軸。問(wèn)是否存在一個(gè)正方體,使得這六個(gè)點(diǎn)分別在正方體的六個(gè)面上。若存在,求出這個(gè)正方體的各頂點(diǎn)坐標(biāo)。
題解:不會(huì)。
H. Halting Problem
題意:給一張連通圖,要求選出一個(gè)點(diǎn)集,使得點(diǎn)集中任意選擇兩點(diǎn),從一點(diǎn)到另一點(diǎn)的任意路徑長(zhǎng)度都為? 的倍數(shù)。求點(diǎn)集中點(diǎn)數(shù)最多為多少。
題解:顯然, 時(shí)答案為所有的點(diǎn)。由于是任意路徑,因此兩點(diǎn)間如果存在一條長(zhǎng)度為?
的路徑,那么通過(guò)重復(fù)走某條邊可以得到長(zhǎng)度為?
的路徑。因此,當(dāng)?
時(shí),答案只能為
。當(dāng)?
時(shí),如果給出的圖為二分圖,二分圖左部和右部對(duì)應(yīng)的兩個(gè)點(diǎn)集都是滿足條件的,選擇點(diǎn)數(shù)更多的即可;如果不是二分圖,可以證明兩個(gè)不同點(diǎn)之間肯定既存在長(zhǎng)度為偶數(shù)的路徑,又存在長(zhǎng)度為奇數(shù)的路徑,所以此時(shí)答案只能為
。判斷是否為二分圖使用染色法,時(shí)間復(fù)雜度
。

寫這篇題解主要是測(cè)試b站專欄的代碼高亮以及公式功能,以后或許會(huì)發(fā)更多的題解。