0%

2021 北市賽

最後一次比北市賽了,不知不覺就變成了老人。

計分板

聽說之後會開 judge 給我們載 code,如果有並且我記得的話再放上來。

因為我是金魚腦,範圍不一定是對的。

題目

pA 物件輪廓 (contour)

21 / 23 / 0 / 0 / 0 = 44

給你一個 0/1 矩陣,這個矩陣上有一個連通、實心的由 1 構成的圖形,求他的外輪廓,按順時針順序從最左上的點開始輸出。外輪廓可以走八方位。

這題的輪廓定義其實不太嚴謹,我的解釋是這樣:如果一個 1,它四方位有至少一個不是 1,那它就是輪廓,然後要繞輪廓一圈,繞的時候走的方向可能是斜的,就是八方位,例如:

這題有一些很毒瘤的地方,第一個是他要繞順時針方向,第二個是答案要輸出方向編號,但他的方向居然是照逆時針編號的。

我的作法是,先找起點,然後從向右開始,順時針枚舉方向,如果下一個地方是輪廓而且沒有走過就走,走了之後再從向右開始看。前三個子題是圖形是長方形,但不知為啥我只過前兩個 的。

我後來有用另一個作法,是把方向按順時針編號後,如果這一步要往方向 走,那方向 的那一格應該要是 0,但還是只有 44 分。

其實要過長方形,只要找左上角再找右下角就做完了。

我覺得我寫的東西對不對已經跟怎麼判要走哪個方向沒關係了,連長方形都過不了真的很扯。

pB 情報蒐集 (intel)

29 / 33 / 38 = 100

給你 個序列,第 個序列長度是 ,令:

  • 個序列的最長共同前綴長度

的總和。

應該是整場最簡單的題目,把序列都丟到 Trie 上就好。

pC 套圈圈遊戲 (circle)

14 / 18 / 25 / 23 / 20 = 100

個物品排成一環,每個物品都有分數 ,接下來你要套圈圈 次,每次套一個物品。套到一個物品後,你得到的分數是「它兩邊的物品分數相乘」,如果兩邊的物品是同一個(目前只剩兩個物品)那就是另外那個物品的分數平方,但如果只剩一個物品,套到那個物品得到的分數是他本身的分數,不用平方。

求最大分數。

這題暴力居然可以拿 80 分,真是太可惡了。

(以下的 index 請自行換到 內)

注意它是環狀,不過環狀當然還是可以區間 DP。我的作法是 把第 個往編號大的方向到第 個套掉的最大分數,不過這個部份只算到長度 的區間。轉移式很簡單,就枚舉這個區間最後一個被套掉是誰就好,如果是第 個那就是 ,注意一下邊界就好了。

算完後再處理最後一個被套掉的物品,如果最後一個是 ,那答案就是

pD 海盜寶藏 (treasure)

27 / 27 / 46 = 27

個節點,每個節點有一個數值 ,且

,給你 ,求

這題的題敘沒有寫得那麼簡單,他還有寫一大串,內容大致上是「有一些節點被祕密地挑出來,滿足:

  • 被挑的節點互不相鄰
  • 沒被挑的節點都和恰一個被挑的節點相鄰

把這些被挑出來的節點的 加起來就是答案。」

因為這一段的篇幅很長,所以會讓人以為題目的主體是找出那些祕密的點,而且子題還有幾個是「祕密點集只有一種可能」。我覺得這段的功能只是要讓人知道怎麼寫暴力和誤導人而已,跟滿分解沒有關係。

我在賽中有想到可以用高斯消去做,每一個 都能視為是一些 加起來,所以可以當成一些式子。直接拿去高斯消的話 不一定有唯一解,有唯一解的是 ,那就在高斯消最下面加一條 。因為拿去消的矩陣對角線一定是 1,所以最後一列肯定會被消掉,最後會得到 就是答案。

不過 ,高斯消要 ,如果只消到剩上三角的話可以有一點常數優化變 ,但我賽中真的深深覺得這不會過,然而就是有人這樣過了。

pE 關鍵人物 (key_person)

37 / 63 = 100

個人,其中第 個人和第 個人互為朋友。令一個「交友圈」是一些人互為朋友,「最大交友圈」是最大的交友圈,「社交大師」(我自己取的)是在最多不同的最大交友圈的人,求哪些人是社交大師。

不知道為啥很少人過,但我覺得其實滿簡單的。

對每一個人 找以他為最後一個人(編號最大的人)的最大的交友圈,注意到對於 ,只要 是朋友、 是朋友,那 也是朋友,因為 ,所以其實只要找所有滿足 就好了。

找到以每個人結尾的最大的交友圈後,拿出大小最大的那些就是全部的最大交友圈了(注意所有最大交友圈裡的最後一個人肯定都不一樣),再去幫每個最大交友圈裡的人數一下數量,就知道哪些人是社交大師了。

只到 ,都可以 做。

pF 社交分組 (grouping)

1 / 2 / 3 / 4 / 5 / 6 / 7 / 8 / 9 / 10

Output only

給一張圖,求最小著色數和怎麼著色。

最小著色數是 NP-Complete 問題,所以就只能亂做了,我亂做就拿到這些分。

過程

這次早就有聽說會有 output only 了,所以發題本的時候毫不意外最後一頁看起來像是 output only 的測資表。

一樣開場先打 default code,然後開始看題。比賽一開始我肚子就忽然燒雞,本來想說題目全部看完再去,但真的忍不住了,趕快看完 pA 就跑去廁所。順便抱怨一下,考場離廁所有夠遠。

在廁所裡想了唬爛的作法(然後同一個作法我幾乎用到最後),出來後按照慣例把題目看完。讀到 pD 的時候才發現,哇怎麼有 6 題,師大再次出奇不意。

pB 是水題,直接放在 queue 最前面;pC 我這個時候想到的是 中間的人套掉、 留下來的最大分數,不太好做,但我覺得只是需要想一下的區間 DP,所以放在第二個寫;pE 我看完題目就想到大概的解法了,但需要想清楚一點才能確定是不是對的,先放在第三個寫。至於剩下的題目,pA 有想法但覺得可能不會過,打算前面那三題寫快點去處理這題、pD 晚點再想、pE 亂喇。

跟往常一樣我大概 30 幾分看完題目開始寫。pB 因為我把順序弄反,花了一點時間 debug,51 分鐘的時候才過。接下來就是要寫 pC,本來的狀態導了一下轉移式發現超難做後,花了點時間想出好做的狀態。不過有地方寫爛了,範測沒過,因為時間有點晚了,我就先寫 pE。

(這一段記錄和我的記憶有點兜不起來,我很努力在還原我開題順序很怪的事實真相了 (?))

pE 稍微想清楚一點確定是對的後就開寫,實作應該是所有題目裡最簡單的吧。在 1 小時 24 分的時候 AC,神奇的是我居然是第一個拿到這題分數的人。

回到 pC 後,我手算了一下,然後我手算也算錯了,我就以為範測是錯的,然後提問「為什麼範測 2 的輸出是 XX,如果先套 1 再套 2 應該是 AA + BB = CC、先套 2 再套 1 應該是……」我打的算式當然也是錯的,不過我沒發現。

過了一下子,有公告說 pC rejudge,然後我的提問得到的回應是叫我看公告,我就想說「喔,所以範測真的錯了」,但我又很納悶,他 rejudge 了但沒有改範測,我就問了「範測有更新嗎」,問了後沒幾秒我就發現,啊我算錯了,果然過不久後得到回應「No」。欸不是,上一個提問應該回我 No comment 之類的而不是叫我看公告吧,rejudge 跟範測根本沒關係。

中間我去寫了一下 pA,拿到很怪的 44 分後再回去修 pC。

花了點時間修程式的 bug 後,1 小時 54 分 AC,離結束只剩一個多小時,其實比我的預期晚了很多,本來我是預期 1:30 就要把 BCE 寫完的。

接下來研究了一下 pA 為什麼會錯研究不出來,就去亂寫 pF,直接隨便亂做後丟上去拿到 40,再看了一下 pA 還是找不到 bug,所以又去寫了 pD 的暴力,順便想到了高斯消去的解,看了看 又搖搖頭說「不可能吧」,接下來的所有時間就都花在 pA 上了。

pA 越寫越崩潰,到底為什麼連長方形都過不了,我的作法再怎麼唬爛,都不至於連長方形都過不了吧,但我也找不到有什麼地方錯,就這樣崩潰地結束了。

總結

總分 411,rank 5

結束的時候我超緊張,回想去年一堆人同分的計分板,超怕沒有前二等獎,但是簽成績確認單前又不讓我們拿手機,只好一直緊張下去。更慘的是有工作人員在前面用手機看計分板討論,我聽到他們在討論 pF,還說「也有人拿到很多分數欸」,害我緊張得要命。

pF 最高也才 50 分,為什麼要這樣嚇我 QQ。

打了三年,最後一次總算拿到一等獎了,但還是覺得打得不好,至少 pA 要拿到 71 分,因為長方形真的超好寫,沒想到都這麼老了我還會犯執著在滿分解上的錯。這場我真的幾乎沒有在注意子題,我賽中甚至完全不知道 pC 暴力可以拿 80 分。

我覺得最可惜的是 pD,或許是在北市賽的高斯消去對我來講意義非凡吧,我第一次比北市賽,也有一題是裸的高斯消去,當時還不會高斯消去,所以沒寫出來。後來去學了高斯消去,也遇到了不少要用高斯消的題目,但除了裸題外從來沒做出來、也沒看出來過。這是我第一次在比賽中看出不裸的高斯消去題,但就是因為覺得 太大,而且我寫程式常數本來就偏大,覺得不可能過,就選擇把時間投資到 pA 上了(結果投資的方式也是錯的)。不過我覺得沒去寫也不算是我的錯,畢竟寫高斯消去要花一點時間,比賽時間已經很緊迫了,還覺得不過的機率很大,只是一直都覺得高斯消去是一個心結,這次不能完全解開,覺得很可惜。

如果我過 pA 我就會是第一名、只寫長方形也會是第二名,其實這還沒像 pD 那麼讓我覺得可惜,不過這是比較需要檢討的事情。

最後評論一下這場比賽吧,題敘寫得都有點難懂,而且 pA 寫得很不嚴謹(也有可能是因為我沒過才這樣覺得),不過鑑別度還不錯,而且一二三等線都有一個小斷層,切得還不錯,只是對後面的人來講題目有點太難了。我覺得 BCE 都是不錯的題目,如果 pD 範圍小一點的話也不錯,雖然感覺前年還是比較好,但跟去年比起來今年好很多了。