題解 種樹(堆)

2022-02-19 19:11:55 字數 2326 閱讀 2202

考試題目叫 so , 和這道種樹幾乎差不多

description

cyrcyr今天在種樹,他在一條直線上挖了n個坑。這n個坑都可以種樹,但為了保證每一棵樹都有充足的養料,cyrcyr不會在相鄰的兩個坑中種樹。而且由於cyrcyr的樹種不夠,他至多會種k棵樹。假設cyrcyr有某種神能力,能預知自己在某個坑種樹的獲利會是多少(可能為負),請你幫助他計算出他的最大獲利。

input

第一行,兩個正整數n,k。

第二行,n個正整數,第i個數表示在直線上從左往右數第i個坑種樹的獲利。

output

輸出1個數,表示cyrcyr種樹的最大獲利。

in.1

6 3100 1 -1 100 1 -1

out.1

200資料範圍與約定

對於20%的資料,n<=20。

對於50%的資料,n<=6000。

對於100%的資料,n<=500000,k<=n/2,在乙個地方種樹獲利的絕對值在1000000以內。

20分做法:

想怎樣暴力,就怎樣暴力。20分暴力做法之多。

50分做法:

dp,轉移並不是特別難。

我們定義 dp[ i ][ j ][ 1/0 ] 表示遞推到第 i 位,已經選了 j 個數, 1/0 表示當前位是否選擇

實際上和沒有上司的舞會的dp轉移很像,不過是序列上的

dp[ i ][ j ][ 1 ] = dp[ i-1 ][ j-1 ][ 0 ]

dp[ i ][ j ][ 0 ] = max( dp[ i-1 ][ j ][ 0 ] , dp[ i-1 ][ j ][ 1 ] )

答案取 max , 滾掉第一位以節省空間

主要思路

1.處理選擇矛盾的情況,即可以反悔。

我們考慮,當選擇了乙個當前最大值 a[ i ] 後,發現其實最優值要選擇a[ i-1 ] 和 a[ i+1 ], 為了可以反悔,在選擇下乙個時,我們把 a[ i ]修改為 a[ i-1 ] + a[ i+1 ] - a[i] 。所以當 a[i] 被選後反悔時,我們在之後的選擇中,我們就可以刪去先前 a[ i ]的貢獻而選擇旁邊兩個。如果不反悔則不選,這樣可以滿足整個結構的最優性。

2.維護序列,不斷滿足上述條件

最大值我們考慮使用大根堆(優先佇列來維護),先把所有值和編號壓入堆,並且記錄左右值的編號,在選擇了 a[ i ]後進行上述操作,同時更行左右值得編號即可。整個操作進行k次,由於存在負值,所以要不斷取最大值。

細節:

邊界是不能合併越界,處理下即可。

#includeusing namespace std ;

#define ll long long

const int maxn = 500005 ;

inline int read()

while(g>='0'&&g<='9')s=s*10+g-'0',g=getchar() ; return s*w ;

}priority_queue< pair>q ;

int n , k , tot ;

ll ans = 0 , last = 0 ;

struct apt[ maxn ];

int main()

t[ n ].r = 0 ;//邊界

while( k-- )

ll v = q.top().first ; q.pop() ;

ans += v ; t[ t[ u ].l ].f = t[ t[ u ].r ].f = true ;//更新答案

t[ u ].val = t[ t[ u ].l ].val + t[ t[ u ].r ].val - t[ u ].val ;

t[ t[ t[ u ].l ].l ].r = u , t[ t[ t[ u ].r ].r ].l = u ;//updata,更新左右編號

t[ u ].l = t[ t[ u ].l ].l , t[ u ].r = t[ t[ u ].r ].r ;

q.push( make_pair( t[ u ].val , u ) ) ;

last = max( last , ans ) ;

} cout<}

種樹的藝術題解

1.狀態 通過讀題我們不難得出狀態 dp i j k 表示i個樹左邊看有j個右邊看有k個 我也只想出了這個 2.狀態轉移方程 假設把最小的乙個樹 應為假設最小的一棵樹方便分析,若假設其他的會有奇奇怪怪的事情 放在最左邊則是前i 1棵樹左邊看到j 1右邊看到k棵的方案 同理若放在最右邊則是前i 1棵樹...

2017種樹題解

每棵樹的費用為 cost i sum x i x k 由於 x i 與 x k 的大小關係的存在,我們可以把它分成兩部分 sum x i x k x i x k,1 le k le i 1 sum x k x i x i x k,1 le k le i 1 上面 1 式繼續展開 sum x i su...

SSL 練習題目 種樹 題解

種樹 normal time limit 1000ms memory limit 65536k total submit 213 accepted 114 description 在6 6的方格地盤中,種植24顆樹,使每行 每列都有4顆樹。求出所有可能的種植方案總數。種植方案的說明 輸出乙個6 6的...