資訊學競賽打表犯規嗎?

2021-09-20 15:40:26 字數 1420 閱讀 3206

到了2023年3月份,我學演算法已整一年。這個時候我覺得應該看一下提高組的複賽題了。noip 2018提高組初賽的題去年看過,比普及組難了不少,但是整體還好,沒達到非常難的程度。複賽題我沒做過,但是想必會難很多。

通常而言,難度是逐題遞增的,最後一題就是最難的。不過少數情況下是例外,這種情況下出題者會故意把壓軸題調到倒數第二題的位置,比如noip 2023年普及組的複賽題就是如此。

noip 2023年提高組的最後一題最難,題目名是「保衛王國」。題目倒是很容易看懂。不幸的是,看完之後,除了看出來是考察圖論外,我幾乎毫無思路。圖論是資料結構裡的最難的一章,沒有有之一。整個資料結構,其他的內容我都很熟悉,唯獨圖論僅僅學了點皮毛。

既然自己沒有思路,那就直接看別人的答案。遺憾的是,看了整整兩天,也沒看懂別人的思路。倒是在這個過程中,了解到涉及的知識點有lca(最近公共祖先)、倍增、樹鏈剖分 + 動態規劃的方式實現。倍增和樹鏈剖分對我來說是全新的概念,以前聽都沒聽過。

這樣的話,這題就不能繼續做了,要先把基本的最近公共祖先學了。無論是學什麼新的演算法,首先要學的就是暴力法,暴力法最簡單,理論上可以用來解決所有的問題。遺憾的是,暴力法天生效率低,只要資料量一大,暴力法很容易超時。學了暴力法之後,感覺對求最近公共祖先的方法有了基本了解,就繼續學倍增方法,結果發現倍增不太難。

接下來就是樹鏈剖分。樹鏈剖分的原理也不難,但是看**的時候,發現用到了build(), pushup(), pushdown()等函式,這些看起來像是用到了別的知識。幾經查詢,發現原來是乙個新的知識點:線段樹。

線段樹是一種很奇妙的思路。看到線段樹的時候,我想起不止一名學生曾對我說過:演算法太可怕了!很多奇妙的演算法,前輩們不知道是如何發現的,但毫無疑問是付出了長時間的汗水才研究出來的,等到你去學的時候,你就會發現思路精妙無比。有些演算法思想確實太可怕。

學完線段樹再回到樹鏈剖分,理解起來基本就沒有問題。

然後再回過頭來看「保衛王國」的答案,這個時候深入思考加反覆除錯,終於理解過來。

理解了「保衛王國」的解法後,我回想起來,在這些過程中,我發現圖的構建方式用了一種列舉邊的方式,具體是倒序列舉。我以前不知道這種方式,是通過無數次模擬才理解過來的。我猜測這也是乙個專門的知識點,幾經查詢發現這個叫做「鏈式前向星」,是在「前向星」的基礎上優化過來。「前向星」對我來說,也是乙個全新的名詞。「鏈式前向星」和「前向星」都是圖的儲存方式,有些資料結構的教材裡面並沒有提及。在這之前,圖的儲存方式,我只能理解鄰接矩陣這一種,鄰接表理解得並不透徹。於是把幾種常見的圖儲存方式都學了一遍,最終整理出五種:鄰接矩陣,鄰接表(陣列實現)、鄰接表(向量實現)、前向星和鏈式前向星。

至此,感覺自己圖論終於有所了解了。前後用了乙個月的時間。這乙個月的時間裡我幾乎沒做別的事。整個過程是苦不堪言的,用小朋友們的話說就是:演算法太可怕了!

我也明白了,為何有些人在學習資訊學的過程中,學著學著就放棄了。因為演算法確實非常難,有些人碰到了一些大山,久久翻不過去,就喪失了信心。而那些能堅持翻山越嶺的人,有機會不斷看到新的風景。

資訊學競賽

以資訊學,尤其是程式設計的相關知識為基礎的中 小學學科競賽。分為noi 全國青少年資訊學奧林匹克競賽 noip 全國青少年資訊學奧林匹克聯賽 分割槽聯賽 ioi 出國參加國際奧林匹克競賽 等等 推薦語言為 pascal lazarus 0.9.10或free pascal編譯器2.0.1版 c c ...

資訊學競賽OI 常用OJ

常用oj名字 位址 不定期更新,自己用,有補充的也可以給我說說哈。中文openjudge tyvj 老oj,現在基本屬於清北學堂了 codevs 原來的wikioi,模仿usaco的天梯,有云評測 rqnoj 老oj,裡面有很多經典題 vijos 也是老oj之一,初始是由湖南師大附中的乙個學生編寫的...

各種資訊學競賽的含金量

最具含金量的資訊學競賽當然是資訊學奧賽。資訊學奧賽和奧數 物理奧賽 化學奧賽 生物奧賽,合稱五大科奧賽。奧賽的含金量遠超文科類的競賽比如全國英語競賽和新概念作文競賽,也遠超五大科其他型別的競賽。奧賽整體上分為三個級別 省級聯賽 全國競賽 國際競賽。從選拔的角度看,奧賽可進一步細分為七八個級別。信奧如...