1. 程式人生 > >12.30模擬賽

12.30模擬賽

ati 暴力 處理 最小 得到 兩個 取出 樹形dp 不用

我好菜啊

又雙叒叕墊底辣

其實題目並不難

不光是度把握不好,而且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模擬賽