1. 程式人生 > >Codeforces比賽規則

Codeforces比賽規則

Codeforces
簡稱: cf(所以談論cf的時候經常被誤會成TX的那款遊戲).
網址: codeforces.com
  這是一個俄國的演算法競賽網站,由來自薩拉托夫州立大學、由Mike Mirzayanov領導的一個團隊創立和維護,是一個舉辦比賽、做題和交流的平臺.舉辦比賽和做題就不說了,“交流”指的是自帶blog功能,可以求助/釋出題解之類.官方語言是俄語和英語,因此可能有些偏僻的題目的題解是用俄語寫的,別慌,扔給Google Translate翻成英文,可讀性還是很不錯的.至於英語,cf上Russian English確實有,但並不嚴重,題目裡偶爾會出現很奇怪的表達方式或者不常用的詞彙,這時候就藉助樣例吧,找個人問問也是可以的.cf最大的特點是比賽,所以接下來主要的篇幅用於介紹cf傳統比賽的規則.

在cf,所有的使用者根據在以往比賽中的表現被賦予一個Rating並冠以不同的頭銜,名字也會以不同的顏色顯示,比如Expert是藍色,Master是黃色,因此我們通常以顏色代指頭銜.選手們按Rating以1700為界劃分為Div.1和Div.2兩類,相應地,cf上的比賽也會指明是Div.1還是Div.2,抑或同時進行.Div.1的比賽較難;如果同時進行,Div.1的ABC三題會和Div.2的CDE三題相同.每次比賽結束後Rating都會依據此前各個選手的Rating和公式重新計算.對於沒有參加過比賽的新使用者,在比賽後重新計算Rating的時候,他此前的Rating會被視為1500.
  在比賽中,選手有2個小時的時間去解決5道題,而解決某題得到的分數由該題當前的分數減去(不成功的提交次數)*50,這裡,某道題的分數是由比賽開始時的分數隨時間線性減少得到的.同時,這裡的“解決某道題”是指Pretest Passed,即,通過了一次僅含部分測試點的測評,而最終決定是否得到這道題的分數,要看比賽結束後的統一測評(System Test),如果在這時沒有通過,就稱FST(Failed System Test).在比賽中的提交可以看到在哪個測試點出了什麼問題(例如,僅一行WA on pretest 3).

  同一個Div的選手將被劃分到若干個Room裡,每個Room大概30位選手;當某道題Pretest Passed之後,可以選擇鎖定(Lock)該題程式碼,之後就可以檢視同一個Room內其他選手該題的程式碼(當然了,這也是已經通過pretest的),並試圖找出其中的漏洞,自己出一個數據(可以手打,也可以提交資料生成器)讓這個程式碼不能通過,這就是Hack,有時也稱Challenge.一次成功的Hack可以得到100分,而如果沒有成功,將會被扣50分,分別被稱為(un)successful hacking attempt.
  在比賽中,選手可以看到實時的排名(Standing),也可以選擇只看加了好友的選手的排名.此外,還可以看到某題有多少人通過的資訊,這在某些情況下很有用.

關於比賽的事情大概就是這麼多.cf題庫的所有題目都是在該平臺上舉辦過的比賽的賽題,儘管WJMZBMR曾經表示由於出題人很雜cf的題目質量參差不齊,但我個人認為還是夠可以的,兩個小時五道題也確實很能讓人得到鍛鍊.和Spoj形成鮮明對比的,cf的機子效率很不錯,所以很容易培養出STL依賴症等等不良程式碼習慣,應當引起足夠的注意.
  在cf上做題的過程當中如果遇到困難,首先可以看資料.資料從某種程度上來說是公開的,在提交記錄頁面可以看到所有你的程式執行過的資料,但是太大的資料也只會顯示前幾行,因此也不算完全公開.cf的測試資料筆數通常會讓習慣了10個點的人大吃一驚,一道題動輒幾十個測試點,甚至有的有200多筆.通常來說,前面大概5組是比賽時的Pretest,一般會盡可能的涵蓋各種情況,也有放個大資料卡TLE的;其後的資料規模遞增,但是最後幾組又不見得是極限資料——這是比賽時Hack的成果.Hack成功的資料會被追加到該題的測試資料當中.
  如果資料不能解決問題,可以試圖去找題解.題目頁面的右下角會標出它所屬的比賽的相關文件,通常會有Announcement(賽前和賽中的公告,其中賽中的公告通常是明確題意之類),有些則會有Tutorial,這就是題解,順帶一提cf上另外一個表示題解的詞是Editorial.一次比賽的題解可能不是官方的,也可能不包含該次比賽全部的題目的,也有可能是用俄語寫的(前面提到過了,翻譯成英語就好),也有可能有好幾篇(這會以Tutorial #1,#2的形式標識).
  近期的比賽多半都有官方題解,以前的就不好說了.這時候需要藉助另外一個神器:神犇們的程式碼.cf上普通題庫的所有的程式碼都是公開的,並且支援按照提交先後(Judging Time),執行時間(Execution Time)和程式碼長度(Solution Size)進行排序.不僅僅是幫助做題,這個功能對於瞭解一道題的各種做法也是有好處的.
主要的東西就介紹完了.這裡再補充一點一些零散的東西.
  關於Rating的計算 : 這是一種類似Elo Rating的系統,可以在cf的FAQ或Wiki百科找到更詳細的資訊.
  關於Contribution : 在使用者資訊頁面會見到這個東西,它用來衡量一個使用者對cf的貢獻程度.這個數值取決於該使用者所寫的blog和他對其他的blog所作出的評論的“反響”.每個blog的下方和評論的旁邊都會有一個往上和往下的箭頭以及一個數字,表示你可以對他進行好或者不好的評價,而數字則顯示當前已有的評價,而這就是前面說到的“反響”.點選了往下的箭頭會讓這個數值-1,點選了往上的箭頭則會+1或+2,這裡+2的條件是你本身的contribution不低於+25.如果你打算做評論,請謹慎,因為在貼吧裡很正常的回覆可能會被認為“沒意義”或者別的原因而反響很差(比如在比賽預告帖回覆Good luck everyone之類的可以被-12),隨而contribution也會很難看.由於這樣的原因,你可以選擇完全可以無視這個數值.
  關於GYM : 在gym裡舉辦的比賽基本上是ACM/ICPC規則的,可以單幹,也可以組隊(人數似乎沒有限制).gym的題目並不會在Problemset裡顯示,提交之後也不能看到資料(和常規比賽時一樣,僅能看到一行TLE on test 137之類),不過在名字變紅[即(International) Grandmaster]之後選上Coach mode就可以看到資料.gym裡別人的程式碼的公開性也服從前述規則.
關於Virtual Participant : 有時我們會在某條提交記錄的ID右上方看到一個小小的#號或者顯示一個時間,滑鼠移上去會出現Virtual Participant的字樣.正如其字面意思,這意味著這個使用者正在“虛擬”參加一場比賽.如果你虛擬地參加一場比賽,系統會在接下來的2小時內(如果gym的話另當別論)為你完全地模擬當時的情境供你練習——包括Standing等等.
  關於奇葩的測評結果 : 這包括Compilation failed,Denial of Judgement和Judgement Failed.在你確認你的程式沒什麼重大問題之後,基本可以認定這不是你的問題而是系統出了點差錯.Judgement Failed通常會呈現爆發的樣子,一段時間內幾頁都是,當這種情況結束的時候就正常了;而Denial of Judgement僅會在某段時間內在特定的題目發生,原因可能是資料損壞之類的,可能要等上個一兩天才能得到解決(也有可能在問題解決後被自動重新測評);Compilation failed我還沒有見過...字面意思是編譯器不幹活?
附 各個頭銜的Rating範圍和名字顏色:
[2600, inf) International Grandmaster 紅
[2200,2600) Grandmaster 紅
[2050,2200) International Master 黃
[1900,2050) Master 黃
[1700,1900) Candidate Master 紫
[1500,1700) Expert 藍
[1350,1500) Specialist 綠
[1200,1350) Pupil 綠
(-inf,1200) Newbie 灰
附 "ALL" CodeForces Rounds Tutorial By iman_MC
codeforces.com/blog/entry/1492
有些Codeforces上有人發過的題解並沒有被連結到對應的題目上(即,存在題解,但是題目頁面右下方並沒有Tutorial連結),有可能可以在這裡找到.
當然這也並不是完全的,而且時不時會更新.具體裡面有哪些我就不廢話了,各位自己去看看吧.