預處理的方案很多,但各有利弊。
比如,在這道題中,如果使用線段樹來做預處理,需要維護三個值:區間內最小值、最大值、數的個數。
這種辦法有個缺點,當Hi的值很大時,有可能會內存開銷過大,導致空間超限。
根據規定,程序可以使用的內存只有128兆,一旦使用的內存超出限制,則整道題0分。
為了解決這個問題,就需要進行離散化操作,平添難度。
江寒通過分析,綜合比較、權衡了一番后,選擇了比較保險的雙向鏈表模擬算法。
相比線段樹,雙向鏈表不需要離散化,但是細節比較多,調試起來會稍微麻煩一點。
江寒自然不怕這點麻煩,一個是他對雙向鏈表掌握得很好,二來……早上吃那么多東西,就是為了用在這種地方的。
只要舍得全力開動腦力,編寫起這種復雜度的代碼來,只是小意思。
還剩下一個半小時,時間上是完全夠用的。
對輸入數據進行了預處理之后,接下來就可以尋求題目要求的解答了。
這一步,可以用“倍增法”進一步提速,這樣就可以保證,在很短的時間內算出答案,避免時間超限。
由于答案數字很大,這道題也要用高精度來處理一下。
但和第二題又有點不一樣,這道題的精度壓力,其實并沒有那么離譜,完全可以嘗試采用longlong(對應著vs里的int64)數據類型來解決。
如果為了萬無一失或者炫技,當然也可以再次手寫一個高精度算法。
但江寒經過分析、計算,認為longlong已經完全夠用,就沒費那個勁兒。
放在幾年前,在NOIP等各種編程比賽中,longlong還是禁止使用的數據類型,但從去年開始,NOI官方終于放松了限制,明文允許使用了。
這樣一來,很多難題的編程復雜度,就被大大地削減了。
編寫完第三題的代碼,調試通過后,江寒又設計了一些數據去檢測,結果完全正確。
看看時間,還剩下半個小時。
這個時間自然也不能浪費,江寒將代碼整理了一番,清理掉調試數據,注釋掉不需要的輸出,刪除多余的文件。
最后,再跑了一遍代碼,確認毫無問題后,又利用最后十分鐘,復查了一遍文件夾、源代碼、輸入輸出文件的命名,排除各種低級錯誤。
別說,還真讓江寒查出了一個問題,第1題的輸出文件名,打漏了一個字母。
應該是vige,結果打成了vigener.out。
這可不是什么小問題,如果沒查出來,就是致命錯誤。
如果文件名弄錯了,程序編得再完美,也只能爆0!
每年都有不少“大神”級別的高手,折在這種低級錯誤上。
好在江寒的時間非常寬裕,這才能及時發現并糾正。
不過,等到明天進行Day2比賽時,就要吸取教訓了。
江寒默默地想著。
像是這樣的地方,最好從題目中直接復制、粘貼過來,不要再手打……
一切梳理妥當后,時間也差不多了,還剩最后兩分鐘。
江寒舉手示意。
監考教師走了過來:“什么事?”
“交卷。”江寒輕聲回答。
頓時,刷刷刷,許多目光掃了過來。
因為機器擺放的問題,沒有人可以看到別人的屏幕。
可是,能看到臉色啊。
發現江寒一臉的云淡風輕,那些人頓時就心里明鏡,這只怕是一位真大神。
也只有真正的競賽高手,才會時間充裕到這種程度,不等監考教師主動喊停,主動交卷。
監考教師核對了一下江寒的答題文件夾,然后就示意他可以離場了。
這就是NOIP比賽比較人性化的地方了。
比賽時間截止后,所有選手只需有秩序離場,別的什么也不用管。
監考者會負責收集答案。