本著貪心的思想,我先斜著走到頂,然後直走到終點,顯然這是最優的,但是我忽視了斜著走的最後一步可以和直著走的第一步合併, 我錯誤地把兩個過程分開了。假如我當時多找幾組資料來模擬說不定能找到這個錯誤,我也沒敲個暴力來對拍(因為暴力太長了)。我得到的教訓是:不能肯定自己演算法的正確性是,不如敲個暴力對拍一下, 雖然可能花更長的時間,但總比沒分好啊。
我敲的是o(
n2) 的,按照資料範圍來講只能過60分的資料,但是由於我在找到答案時立即br
eak ,並且資料也不卡,我還是得了80分。貪心的思路很容易想到,就是對於每個位置我們找最大能夠到達該位置的數,我當時只想到o(
n)地列舉。而正解是用線段樹維護,當前點的個數和區間的最大值,每次查詢時,找乙個區間滿足sz
≤k+1
,然後求出最大值即可。
考試的時候我算了算,500以內能夠相對互質的數對有90000多對,我們只要df
s 預處理每個點的子樹裡每個數的個數即可,然後乘一下就是知道該點通往父親的邊的對答案的貢獻了,但這並沒有什麼卵用,當時我也沒這麼敲,因為這樣只能過30分的資料,我換了種思路,然後直接tl
e 了。
對於60分, 我們定義f(
i)為gc
d=i 的點對的傳輸時間之和, 那麼答案就是f(
1),那麼如何求f(
i)呢?對於
i ,我們可以將它的倍數的點看做關鍵點,則這些關鍵點間的gc
d都為i 的倍數,我們可以o(
n)求出f
(i) (f(
i)表示gc
d=i 的倍數的點對的運輸時間之和),那麼f(
i)就是f(
i)減去f(
i的倍數
) 。
滿分的話思路跟60分的一樣,但是不用遍歷所有的點,因為要用到的並不是全部的點,而且100000以內因子數最多的數只有128個因子,所以最多只要跑128個點,那麼如何把這些點抽離出來呢?要用到虛樹,就是把關鍵點連成一棵樹,對於所有關鍵點,我們按dfs序從小到大大排序,然後再兩兩求lc
a (lc
a 的求法有很多種,然而我只會兩種,等下講),將求出的lc
a 也加到這些點中,但不計入答案,最後我們要把
1 進去,因為造出來的虛樹是兩棵分開的樹,需要乙個公共的根,用棧便利虛樹,求出每條邊的貢獻。對於求lc
a有兩種方案,挑重鏈和倍增,挑重鏈是我新學的,因此這裡我講一下挑重鏈的方法。 df
s 一遍我們求出每個點的重兒子(子樹規模最大的兒子),再rd
fs一遍求出每條鏈的to
p ,假如遍歷到重兒子,那麼to
p 就延續下來,否則是重兒子本身。 總結
重點是心態要放好,不能看到一道題目難就不寫,這樣會錯過很多知識,比如t3讓我學會了新的求lc
a 的方法。t2的話當時沒仔細想, 想到用資料結構,但是不知道怎麼實現,現在想想還是可以寫的。
離線賽20171006總結
這次考得還不錯,頗有些遺憾的是因為第一題我離正解已經很近了,可惜考試畢竟是考試,一開始的題目看錯沒看到相鄰的條件浪費了很多時間,到後來就沒有時間去寫正解了。這畢竟也是一種實力,不能說題目看錯失誤問題就不大。上次的考試兩個輸出只能模乙個沒看到導致少了70分。這種失誤還是太低階了,也太致命了。這種題目看...
2017 10 7離線賽總結
失分小結 估分 玄學 實際分數 300 收穫 寫題前仔細分析題目,好好思考 考試過程 第一題真的想不到,只好打個表,結果由於資料半天沒輸出來,心態 有前前後後折騰了半個小時 第二題先是打了個n n暴力,又調了半天,這時考試只剩下兩個小時 第三題思考了大約十分鐘,然後想到了正解,實現比較快,乙個小時就...
2017 10 9離線賽總結
思路 一道很水的題目,隨便怎麼搞 向兩邊擴充套件或o n 預處理 然而我偏偏太過於自信,o n 預處理時最後乙個區域的r忘補充了 一敲起水題來就管不住這雙手 思路 一道十分有趣的dp,雖然dp很明顯,但需要找到其中的規律,結果是要字首和維護字首和 欺負我讀書少 卡了我超久,最後只寫了o n 2 沒有...