有n個東西,每個東西有價值和**,然後要求乙個**上限,和除了第乙個東西以外都有乙個買這個之前必須要買的東西。
求最大價值
我們考慮之前的樹形揹包
然後發現時間複雜度o(n
3)
o(n^3)
o(n3
),之後我們考慮乙個方法
之前是將子節點合併起來所以時間會很久,可是我們可以將乙個子節點處理好,然後直接仍給它的下乙個兄弟,這樣就可以o(n
2)
o(n^2)
o(n2
)解決這個問題
#include
#include
#define n 2010
using
namespace std;
struct nodea[n*2]
;int n,m,dfn[n]
,size[n]
,ls[n]
,f[n]
[n],tot,cnt,v[n]
,p[n]
,x,y;
void
addl
(int x,
int y)
void
dfs(
int x,
int fa)
//計算dfs序和子樹大小
}int
main()
dfs(1,
0);for
(int i=n;i>=
1;i--
)printf
("%d"
,max(0
,f[1
][m]))
;}
洛谷 1196 題解
有30000 30000 3000 0個佇列,初始每個佇列裡有元素1,2 3 30000 1,2,3 cdots 30000 1,2,3 3000 0。兩種指令 1.m mmi iij jj 編號為i ii的佇列整個接到jjj上 2.c cci iij jj 問編號為i ii,j jj的兩個點之間 ...
nssl 1336 膜拜神牛
d es crip tion description descri ptio n 給定長度為n nn的序列a aa和b bb,若滿足ai aj a i geq a j ai aj 且bi b jb i leq b j bi bj 則i,ji,j i,j互相膜拜,求最大的互不膜拜集合 資料範圍 n 1...
nssl1476 聯 線段樹
無限長的01 0101 序列,每次進行乙個操作 區間內賦值為0 00區間內賦值為1 11區間取反 求第乙個0 00的位置 離散化 儲存每個區間的左右端點和他們加一之後的值 後可以用線段樹儲存第乙個0 00和第乙個1 11的位置。然後區間取反時就交換兩個值並且讓laz ylazy lazy 標記同樣取...