序
在此先感謝 inker 帶我出門!當然也感謝 彰師大 這次辦的程式競賽。這是一場久違的比賽,同時也是這學期最後一場,原因是因為太久沒參賽,導致往後的桂冠賽也無法參加。
至於討厭比賽的問題,這一篇就不多說了。記得下次繼續支持彰師大資工辦的活動,免得像靜宜大學被玩壞了。 CCPC 官網
賽前
比賽前日進發 inker 豪宅,中間歷經坐錯區間車,到比賽會場前,徒步走了三十分鐘到火車站搭車 … 各種經歷深感出門是件難事。跟我肯定是不幸的,應該多少有點關聯。
上次比賽是很久之前的事情,想到這次還會遭遇國手,還有清華交大的選手,深感害怕。在這情況下,要出門見人什麼的,讓我窩回宿舍吧!
題目
Problem A Non-boring sequences
UVa 1608 - Non-boring sequences
結果題目還是讀錯了,對於任意連續區間,都存在一個獨特的數字。
很容易誤解 connected subsequence
簡單的說就是相鄰兩個元素。
這題由於讀題錯誤,在全場第一個送出的同時拿下的 Wrong Answer
。
在假解的情況下,居然通過了測試。
|
|
Problem B Traffic Jam
這題是全場最噁心的題目,但是沒想到有人用 BFS 還是 DFS 在每個詢問就過了。
賽完看到記分板表示非常火。
猜測解法如下,採用線段樹的方式。
觀察
對於任兩點詢問假設這個區間是 [l, r]
,不管同側還是異測,當然你也可以假設兩旁還有可以連的。發現對於區間 [l, r]
的點來說,會有左上無法到右下的情況或者左下無法到右上,兩者只有符合一個條件就可以說出 NO
。
推倒
因此我們維護區間 [l, r]
的左上到右下、左下到右上的連通性。
對於區間 S 來說,可以切成 S1 和 S2,維護四條資訊,連通性有無 0/1。
- A(左上, 右下) =
- S1.A & S2.A & (wx || yz)
- S1.A & S2.D & (z || wxy)
- S1.C & S2.A & (x || wyz)
- S1.C & S2.D & (wz || xy)
- B(左下, 右上)
- C(左上, 右上)
- D(左下, 右下)
剩餘 BCD 三條類推,有空的時候再來填滿它,也就是說,之後的開邊跟閉邊都屬於單點更新,因此可以在 O(log n)
時間內完成。對於詢問兩點時,找到 [l, r]
查找 A || B
的結果,由於線段樹會切成數個區間,這個時候要由左而右依序組合即可。
Problem C Finding the Prime Implicants of a Boolean Function
這題就是單純複雜,但是輸入卻不明確。主辦單位有說會忽略空白比對,但是對於 Invaild input format
來說,題目也沒有說清楚輸入格式。
好吧,硬著頭皮做,至少把範例輸入輸出弄了一樣,但是卻砸了。
對了,關於 subset 有個快速地找法。
這個寫法會在幾題的 UVa 中見到,速度快了 X 倍,不過這題測資沒有強成這樣,也許只是我寫太瘋狂了,想不到更好的解法來完成。最後掛了 Wrong Answer
,直接默哀數分鐘。在我心中-她過了。
這題就是窮舉,將每一種組合拆成兩個去合併,而每一種組合(16 bits)如果能合併成一個 product item
則用一個 exist(4 bits)
和 mark(4 bits)
表示,
因此,對於每一個組合拆成 a, b,其中 a.exist == b.exist,同時變數差異只會有一個。
|
|
Problem D Binary String
雖然詢問每個參數最大上限後,發現在 m = 100 的情況下,窮舉有點刺激,但是題目卻是要求輸出每一種組合,所以想必組合也不會太多,所以直接亂來吧!
至於以下代碼的正確性就交給神吧,反正都是亂做過的。
|
|
Problem E Digits Count
這題在 UVa 見過,但是要在比賽中打出來,卻卡死兩個很久沒用腦的人,直到鎖版 (最後一個小時) 才湊出來。
|
|
Problem F Math Problem
大數二分開 n 方,根據別組的討論,才發現數字其實還挺小的,用 double
型態做 log 運算即可。
|
|
Problem G Better Method
聽說是曾經的萬年測試題,這次難得變成主角,肯定是想要每組至少都能帶一題回去。跟 ICPC 一樣的設計方式呢。
|
|
Problem H K-Anonymous Sequence
本次第二難的題目,但比賽時也是用假解過的,實質為單調對列,可以在 O(n)
時間內完成。至於假解的方式就不方便提供。
賽後
UVa 2000+ 才到這了,腦部硬體的差距就是如此地遙遠,即使捨去其他應用軟體,仍然趕不上嗎?
|
|
|
|