ZJOI2018 Day2 滾粗記 流水賬

2022-05-09 14:54:19 字數 2903 閱讀 1492

一臉懵逼地就被直接拉過來浙江省選了,一年參加兩次省選成就達成……

講課啥的都沒聽,過去休息了一天就進行比賽了。考試之前感冒沒好透,精神不是 \(100\%\) 的狀態,但是並無大礙(反正最後都很涼)。

這次是 8:00 到 13:00 的標準 oi 比賽時間,五個小時三道題。

題目連線應該在 loj 上可以找到:t1,t2,t3。

首先拿到第一題,樹的計數,這種複雜計數的問題對於我而言向來都是打暴力,不知為何我想了一會才往下看題……

看到第二題,是統計乙個最短路演算法的類似複雜度的東西(但不是複雜度,準確來說是每次更新節點的個數之和),看完題目就瞬間有了一些 idea,所以預感這題可能 ac。

然後去看第三題,乙個計算幾何,而且不是無腦模擬或用資料結構優化、亂搞的那種,完全不會做。(考後才知道這個是乙個反演,我從來沒有接觸過的東西。它的變換所有點就是關於某個點朝靠近或遠離的方向移動,移動後和移動前和這個點的距離互為倒數;然後那個中心點等概率出現在乙個矩形區域內部,問你變換一次後的凸包點數期望)然而發現有乙個測試點 \(n \le 3\),後面又保證了所有測試點有 \(n \ge 3\),這答案不就是 \(3\) 嗎,直接輸出拿 \(10\) 分走人。

回過去看 t2,順著剛才閃現的靈感想了下去(在想之前我先打了乙個暴力並過掉了小樣例和大樣例)……它求的是點權變化次數總和,那麼我們可以換一種統計方式,變成統計每個點變化過多少次不就行了嗎?想了想發現這樣就變成水題了,因為我想的是找到每個點它最終是從左邊哪個點更新過來的、從右邊哪個點更新過來的,然後左右這兩個點之間的點的個數就是答案……手算了一下樣例發現過不了,所以感覺自己是漏掉了一些「細節」——原來我沒有考慮距離問題,也就是說假設我研究的點是點 \(u\),它最終從 \(v\) 更新過來的,那麼 \(u\) 和 \(v\) 之間的邊的數量需要向另乙個方向倍長,然後得到的這個區間內的點數才是答案……然後自以為這個肯定是正確結論了,於是想了半天如何處理這個問題,由於我研究的點是一段一段的,不能暴力研究每個點(否則複雜度退化成每次詢問都要 \(o(n)\)),以為用主席樹啥的暴力搞;後來不知什麼時候突然發現這個結論的嚴重 bug,其實應該是左邊、右邊單調棧各一段,按照和點 \(u\) 的距離合併的單調棧大小(就是說這個區間內不一定所有點都會更新到 \(u\),只有往兩邊不斷變小才會更新);那我想單調棧合併不可能快速進行啊,感覺非常不對勁,於是打算推翻之前的想法,換另乙個思路。

其實統計變化次數不一定要統計每個城市變化次數,可以統計每個給出的關鍵點的影響範圍大小,這個影響範圍大小的總和也是答案。然後一眼看出這個「影響範圍」就是乙個區間,所以我們需要二分來確定兩個端點的位置。我想乙個關鍵點是有可能「吃掉」另乙個關鍵點的,\(a\) 吃掉 \(b\) 意味著最終最短路不會從 \(b\) 出發,那麼這時 \(a\) 的影響範圍完全包含 \(b\)。(以下只講求右端點)所以我就先二分這個 \(a\) 會吃掉哪些關鍵點,然後影響範圍一定在最遠的被吃掉的關鍵點的右邊,那麼這個時候再二分一下不就行了嗎?我於是立刻敲起了**,調了一會過掉了小樣例,接下來就去測大樣例,發現似乎只有第乙個詢問對了;我重新想了一下這個思路,感覺沒啥漏洞,沒辦法只好和暴力用小一點的資料對拍。

沒想到隨便生成一組資料就拍出錯了,於是我就看這個資料,發現了我剛才思路的漏洞:限制我影響區間不能往後擴的的不只有第乙個沒被吃掉的關鍵點,後面的關鍵點可能會有更強的限制……於是我就想,最強的限制不就是 \(v_i + s_\)(\(v_i\) 就是關鍵點的初始值,\(s_i\) 是 \(w_i\) 的字首和)最小的關鍵點嗎?直接用它限制就好了。改了一下**,再拍,還有錯,但錯誤明顯變少了。接著找問題,這個想法還是有漏洞:注意到假設關鍵點 \(b\) 限制了關鍵點 \(a\),那麼我是要二分到那個從 \(a\) 更新比從 \(b\) 更新更小的最靠右的點 \(x\),這個 \(x\) 就是 \(b\) 對 \(a\) 的限制,但如果這個 \(x\) 在 \(a\) 和 \(b\) 的中點(這個中點是假設邊權都為 \(1\) 的中點,就是隻數邊的條數)左邊,這個 \(b\) 對 \(a\) 就沒有任何限制了(或者應該說限制不是 \(x\) 而是 \(a\) 和 \(b\) 的中點),所以我們要排除掉這些沒有限制的點。於是我想我需要處理每個點右邊離它最近的且權值 \(v_j - s_\) 比他小的點,這樣維護一棵樹,那麼我們就可以在某個點到根的鏈上進行二分了(為什麼可以二分呢?那是因為隨著往根上走,中點會越來越靠右,限制點會越來越靠左,所以是單調的,我們可以二分到「限制有效」的那個點),於是搞個樹上倍增就可以 \(o(\log^2 n)\) 解決了。

想到這裡,發現已經 9:15 了,t1 暴力還沒打呢,這個正解**也不知道寫不寫得完了——又是乙個艱難的選擇。這裡我選擇了求穩,我去打了 t1 的暴力(原因是 t1 暴力看上去非常好寫;而且當時我想 t2 時間太久我不確定我是否還足夠理智,不確定最終的那個想法是否還有漏洞,如果有,那我正常比賽就完全掛掉了,連暴力分都沒拿滿,不值得用整場比賽賭乙個不知道是否正確的正解),打完暴力只剩 \(10\) 分鐘了,我把 t2 那個寫了一半的「正解」和暴力拼了起來,過掉了小樣例、大樣例,然後查一下三道題的目錄、檔案讀寫等等就結束了。

考後發現 t2 正解非常簡單,根本不需要先二分「吃掉」哪些關鍵點,直接二分求區間端點就好了,程式實現、思路上都會簡潔許多。最後在 loj 上過掉了。考場上最後想出的做法沒有實際驗證,但是從思路上看沒有漏洞了。

總結一下,這次比賽思路上走的彎路非常多,t2 我想錯了至少 \(4\) 次,每次都還覺得挺對,沒有及時意識到錯誤直接開始考慮程式怎麼寫,導致過量時間的浪費,造成乙個小小的遺憾(如果 a 掉 t2 應該就全場 rank 1 了)……並且想錯是一件很可怕的事情,最後我的那個正解想先二分被「吃掉」的關鍵點受的就是之前「考慮求每個點被改多少次」的思路的影響,拐了很多彎,沒有找到最直接、最有效、最簡潔、最優美的做法;其實我覺得即便考場上我調出來了 t2,用的如果是那個複雜的做法的話也是值得反思的。這次我想到了正解,說明水平也沒那麼差勁,但這次想到的正解也反應出來我的思維水平還沒有達到一定的高度,我在想錯之後沒能夠完全跳出錯誤的圈子,而是多少仍然受著影響……想錯可能無法避免,所以我們在努力嘗試想對的同時似乎也應該準備一下想錯後的「應急方案」。

這場比賽也有不錯的幾點:

ZJOI2018一試滾粗記

喵嗚 果然我還是乙個去打醬油菜雞啊。最後在家的一天啊 晚上開了一場arc發現自己簡單題都不會做了啊藥丸。只a了一題然後非常難受,感覺不用去zjoi了去了也爆零爆爆,報到日。為什麼又是在衢二啊。早上高鐵去的 下車時發現和r爺 jyt同一班車qwq 感到了自己是那麼的渺小。下午和晚上都在開水題刷刷,根本...

ZJOI2018一試滾粗記

寫在前面的話 可能這篇遊記不像前幾篇遊記那麼沉重,因為陰鬱的文章背後,是乙隻陰鬱的欣。而陰鬱的欣只會心態 考試崩盤,從剛學oi時的第一場寧波市賽,考場裡狂吐不止,住了幾天院,再到前年暑假,每天考,每天幾近淚奔,從noip初賽強行掛成85 再到thuwc2018沒過全場題,oi生涯長,全是黑歷史,看來...

真 APIO2018滾粗記

有人說只有大佬才會說滾粗啊爆零啊 然而我真滾粗真爆零啊 d1 聽課,然後夏眠。咦摺紙 哦好吧太神仙了。咦ai 好妙啊好妙啊。咦二分 哇還有wqs二分這種神奇操作,學學學。我是不是還落了乙個 emmmm那時候我一定在睡覺 總結就是啥也不會 首師附食堂還是很好的,感覺很像wc縮減資金版自助。回來就對著w...