0%

APIO 2022

也是最後一次打 APIO 了,這次在師大比,很酷的是用自己的電腦,但是我忘記帶電源線所以跑到超遙遠的辦公室去拿,太笨了。

程式碼·計分板

題目

pA Mars

有一個 的棋盤,每個格子都是 0 或 1,你的目標是找出有多少個連通塊。

但你其實不知道這個表格長什麼樣子。有一台很破的電腦上面的記憶體有 個格子,每個格子有 100 個位元,第一個位元是棋盤上那個格子是 0 還是 1。接下來會做 輪讀寫操作,在第 )輪中,令 ,依序對這些格子操作:,在操作某個格子的時候,你只能存取以它為左上角 的格子,並且只能修改這個格子。

在最後一輪結束後,讓 的格子儲存答案。

白話文就是第一輪時會去存左上角的 的格子,存某個格子的時候只能讀它為左上的 範圍,並且只能改它。然後每過一輪存取範圍的邊長會少兩格。

pB Game

有一張有向圖有 個節點,並給定數字 ,一開始只有對於 ,有 的邊。接下來有 筆操作,每筆操作都會加一條新的邊,每次操作後回答是否存在經過 中至少一個點的環。

pC Permutation

構造一個 LIS 數量是 的 permutation。連續給分,長度 90 內滿分。

過程 & 作法

因為這是 open everything(除了其他人類)的比賽所以不用打 default code (?),先讀題目。

pA 我看完後想了一下,覺得就是每一輪都只弄那一輪會處理到的右邊和下面的邊界,不是右下角的格子,右邊讓它存往右的那條格子們、下面讓它存往下的,至於右下角的格子比較麻煩,不僅要存往右和往下的格子,還要存右下角那片區域。

(示意圖)

重點是右下那片區域怎麼存,我這個時候以為只要存不和橘色那兩條箭頭連通的連通塊就好了,然後認為我做完了,所以在題本上畫個圈表示會做後去看下一題。

pB 看起來就是動態強連通分量,每次更新完都重做一次可以過前兩個子題,滿分沒什麼想法所以就先下一題吧。(對我沒有看第三個子題是什麼)

pC 就是 CSA LIS Generator,只是那題限制比較鬆。作法是二進位分解,要的長度是 ,在這題大概 118。我直接先寫掉,拿了 91.36,然後又花了點時間想有沒有優化的作法,但都沒什麼想法。

接著打算寫 pA,我想說先寫個 確定我沒搞錯操作順序吧,就直接用 100 個 bit 存下整張圖的資訊,拿了個 14 分。正當我要開始寫滿分解的時候,我發現本來的想法是錯的,因為會有兩條橘色上的東西連通的問題,這樣子會重複算到同一個連通塊。初步的想法是再幫每一格存連通塊編號,但這樣每一格要多花 5 個 bit,不能多拿到多少分,我就先不打算寫。

後來又有了一些想法,像是把兩條橘上面有跟右下角連通的標起來,之後只數沒標的連通塊之類的,不久後就發現這個想法問題一堆。

因為 A 沒有什麼進展,我就先去寫 B,寫之前想到我還沒看第三個子題耶,看完後就想到直接維護 每個點能到哪些點就好了,複雜度是 ,而且還不用寫強連通分量,就這麼拿到 60 分。

再回去 A,我想到如果橘色那兩條上面有東西是連通的,那大概會長這樣

總之就是會像可以用類似括號的結構來表示連通塊。因為一條長度是 的 0/1 字串只會有最多 段連續的 1,每段可以用兩個 bit 來儲存那個括號資訊,分成:

  • 00:左括號
  • 01:右括號
  • 10:往上的(看圖)
  • 11:這個連通塊是獨立的

所以只要花大概 個 bit 就可以處理橘色兩條上面的連通資訊了。

不過有個問題就是存橘色的 0/1 還要另外花 ,再加上要預留 10 個 bit 存右下區域的連通塊數量,100 個 bit 會不夠用。

因為前面的作法都只有用到修改區域的右下那條,而每一輪會退後兩格,所以往裡面一層的那條總是沒用到,我前面就一直在想那條是幹嘛的,這裡就派上用場了,讓 去存橘色那條長什麼樣子就夠用了,只不過 會總是拿不到 這兩格,所以 要多花兩個 bit 去存它們。

我想了幾次後確認這個作法沒問題,時間還剩兩個半小時再多一些,雖然要做的事情很複雜但我覺得應該寫得完,而且有寫出來就起飛了,投資報酬率超高,於是馬上開寫。

中間每告一個段落都有手生個測資驗一下有沒有寫對,雖然多花了點時間,但也避免 bug 堆到最後很難 de。過程中我超緊張的,很怕寫不完,要努力剋制自己不要看時間,不然我會越來越急。中間有時不時去上廁所讓自己放鬆一下,並且把細節想清楚。最後剩快 20 分鐘的時候總算寫完傳上去。judge 速度超慢讓我壓力超大,去上個廁所回來還在 compile = =。

開始寫之後就一直都在寫沒吃過東西了,所以我就一邊等 judge 一邊吃剩下的巧克力,看到綠色的那一刻差點爽到跳起來 = =,剩下的時間就是想一想 pC,但都沒想到,另外就是把巧克力吃完。

總結

總分 100/60/91.36 = 251.36
TWN rank 1
total rank 6

好像因為 A 太難寫了所以一堆人寫不出來,我本來以為應該頂多金牌線,沒想到 rank 6,還沒有人破台(我本來預期中國會有十幾個人破台耶)。

另一件事是 B 和 C 滿分的人大多都沒拿到金牌,看起來是配分燒雞了,C 91.36 超簡單然後 100 超難,B 完全不知道怎麼做但滿分解只值 40 分,而 A 比較多人拿的比較高的分數也就 44 或 54,低分群又偏多,寫滿分就變得超賺。只是是超級大實作 QQ。

不過 C 確實不該值太多分,CF 一堆超唬爛解,好像亂枚舉然後質因數分解就會過了,我賽中覺得這一定有反例所以就沒去寫,果然不該對測資抱有太大的期待 = =。(我好像其實也沒時間寫就是了)