12.30模擬賽
我好菜啊
又雙叒叕墊底辣
其實題目並不難
不光是度把握不好,而且T1,T2還是沒有抓住題目的性質,(性質才是關鍵啊)
(其實大部分題不會做都是因為沒有抓住題目的性質。。)
T1:
一個顯而易見的結論是,兩人一定從S中選擇最大的一個取走
一個顯而易見的復雜度是O(NK)
一個顯而易見的暴力是模擬一遍用堆維護O(NKlogN)
另一個顯而易見的暴力是用一個桶維護出現次數和最大值,然後暴力更新mx.O(N^2K)
沒有別的辦法了嗎?
桶的mx指針往下跳是O(N),因為可能往上跳,
我們其實並不需要桶的指針來回跳,
如果新加入的值大於mx,那麽一定就取這個值,對mx無影響
而小於mx,就放進桶,然後取出一個mx。然後mx向下走更新
這樣,mx單調遞減。
O(NK)+卡常
其實這個題就是優化一下暴力,排除冗余的更新
T2:
考慮樹形dp
鏈豎直,所以考慮f[x]表示x根子樹,x作為一條鏈的上端最大值
O(N^2)可以dfs套dfs
不暴力dfs的話,要考慮能否在兒子鏈的基礎上接上自己
但是直接做不行的,因為最大最小值都不知道是多少。
如果最大最小值在特殊位置,那麽會很容易處理。
經過一些觀察發現
一條鏈一定兩端最大最小值,而且中間單調!
否則劈成兩半或多半一定更優!
所以我們dp轉移的時候,不用找整個鏈
dp[x][0/1]表示x為根的子樹,x作為鏈的頂端是最大值還是最小值的最大總和
要麽不作為開端,要麽和子樹連接。
由於本身是最值,兒子本身也是最值,所以可以直接把貢獻得到。
O(N)
啟發我們:
當題目數據範圍和算法有了矛盾的時候,第一反應不是套高級數據結構暴力搞一搞
而是應該嘗試發現題目的性質,簡化不必要的過程
這兩個題都是在題目性質的基礎上優化暴力。
上次的主席樹維護AC自動機兒子指針也是這樣。
以後還是要打起精神,努力發掘題目性質,嘗試換一種思維等等。
這比套用高級算法有意義的多。
12.30模擬賽