題目描述見鏈結 .
樹上 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時子樹內最多選的點數。我們不難...