題解
1.0 認真分析
對於題目要求的兩兩權值之積不爲0,我們可以在n2的時間內處理出每兩個數之間的關係(即能否同時選)。但最後怎麼統計答案呢??emmm反正連邊跑最長路掛了
以上算法30pts
1.1 正解
那麼正解優越在哪裏呢??優越在它考慮了一個特殊的性質:
設 v= ,則將 ai 替換爲 ai mod3並不會影響答案。
這樣轉化後,除了那些爲 1 的數,其他的每個 v 一一對應着 v′,這兩個數不能同時選取。
這個東西很容易證明,(因爲是嚴格的一次項對應二次項才能湊出三次項),就不多闡述了。
上面提到的是普遍情況,實際做的時候我們還要把本身就是立方數的數拿出來單獨考慮。因爲所有的立方數裏面你只能選一個,所以我們就貪心選最大的那個。
那麼對於剩下的,v和v’只能選一個,還是貪心選大的那個。因爲你會發現每一對之間的決策對別的決策沒有影響啊~
最後落實到代碼實現上,我們要怎麼存下v和v’呢?
我們設定v<v’,當我們算到v的時候就可以順便計算出v’(具體實現看代碼),自然算v’也會得到v。因此我們開兩個數組c[i]和d[i],v=i的貢獻存在c[v]裏,然後把這個v對應的v’的貢獻存在d[v]裏,最後統計答案只需要掃一遍,在c[i]和d[i]裏拿最大值就可以啦~
總結
主要是數學規律的問題,其次這個c數組和d數組的使用也比較巧妙,值得學習。