BZOJ4919 大根堆 樹上LIS

2021-09-29 04:46:46 字數 1196 閱讀 2604

題目描述見鏈結 .

樹上 lis

lisli

s 問題,

使用std::multisetst維護當前子樹內所有可能的 lis

lisli

s 結尾, 從前往後 lis

lisli

s結尾 對應的長度遞增 .

子樹之間互不影響, 只需考慮子樹根節點 u

uu 對子樹內的影響, 模擬 序列lis

lisli

s 的做法,

#include

#define reg register

intread()

while

(isdigit

(c)) s = s*

10+ c-

'0', c =

getchar()

;return s * flag;

}const

int maxn =

200005

;int n;

int m;

int num0;

int a[maxn]

;int head[maxn]

;std::multiset <

int> st[maxn]

;std::multiset <

int>

::iterator it;

struct edge edge[maxn <<1]

;void

add(

int from,

int to)

; head[from]

= num0;

}void

dfs(

int k,

int fa)

it = st[k]

.lower_bound

(a[k]);

if(it != st[k]

.end()

) st[k]

.erase

(it)

; st[k]

.insert

(a[k]);

}int

main()

dfs(1,

0);printf

("%d\n"

, st[1]

.size()

);return0;

}

題解 BZOJ4919 大根堆

題面 傳送門。老師說今天要考一道線段樹合併,然後。然後這道題我就gg了。當然可以用線段樹合併寫,只是比較複雜 有人賽時想了個貪心,然後被機房巨佬hack了,結果在hack的過程中巨佬想出了正解。貪心思路 對於乙個節點,取右邊的 大一點的 肯定更優。其實很好hack啊,隨便搞一條鏈就可以了 ac思路 ...

bzoj 4919 大根堆(set啟發式合併)

傳送門biu 假設是在序列上,就變成了nlogn的dp求最長上公升子串行問題 假設是在樹上,我們只需要在每個節點存下dp陣列,然後用set的啟發式合併將dp陣列合併就可以了 代替splay include define n 200005 using namespace std vector e n ...

BZOJ4919 大根堆 線段樹合併 二分 離散化

題目鏈結 題意 給你一棵樹,每個點有點權,問你最多能選出多少個點,使得所有選出的點中子節點的權值都比父節點小 嚴格小於 點數2e5,權值1e9 題解 首先的乙個暴力是用乙個樹形dp,dp x i dp x i dp x i 表示點x xx為根的子樹內,最大權值是i ii時子樹內最多選的點數。我們不難...