JZOJ 5661. 【GDOI2018Day1模拟4.17】药香沁鼻
树上依赖型背包,转化成dfs序上的问题就随便做了
1 %:pragma GCC optimize(2) 2 %:pragma GCC optimize(3) 3 %:pragma GCC optimize("Ofast") 4 %:pragma GCC optimize("inline") 5 %:pragma GCC optimize("-fgcse") 6 %:pragma GCC optimize("-fgcse-lm") 7 %:pragma GCC optimize("-fipa-sra") 8 %:pragma GCC optimize("-ftree-pre") 9 %:pragma GCC optimize("-ftree-vrp") 10 %:pragma GCC optimize("-fpeephole2") 11 %:pragma GCC optimize("-ffast-math") 12 %:pragma GCC optimize("-fsched-spec") 13 %:pragma GCC optimize("unroll-loops") 14 %:pragma GCC optimize("-falign-jumps") 15 %:pragma GCC optimize("-falign-loops") 16 %:pragma GCC optimize("-falign-labels") 17 %:pragma GCC optimize("-fdevirtualize") 18 %:pragma GCC optimize("-fcaller-saves") 19 %:pragma GCC optimize("-fcrossjumping") 20 %:pragma GCC optimize("-fthread-jumps") 21 %:pragma GCC optimize("-funroll-loops") 22 %:pragma GCC optimize("-fwhole-program") 23 %:pragma GCC optimize("-freorder-blocks") 24 %:pragma GCC optimize("-fschedule-insns") 25 %:pragma GCC optimize("inline-functions") 26 %:pragma GCC optimize("-ftree-tail-merge") 27 %:pragma GCC optimize("-fschedule-insns2") 28 %:pragma GCC optimize("-fstrict-aliasing") 29 %:pragma GCC optimize("-fstrict-overflow") 30 %:pragma GCC optimize("-falign-functions") 31 %:pragma GCC optimize("-fcse-skip-blocks") 32 %:pragma GCC optimize("-fcse-follow-jumps") 33 %:pragma GCC optimize("-fsched-interblock") 34 %:pragma GCC optimize("-fpartial-inlining") 35 %:pragma GCC optimize("no-stack-protector") 36 %:pragma GCC optimize("-freorder-functions") 37 %:pragma GCC optimize("-findirect-inlining") 38 %:pragma GCC optimize("-fhoist-adjacent-loads") 39 %:pragma GCC optimize("-frerun-cse-after-loop") 40 %:pragma GCC optimize("inline-small-functions") 41 %:pragma GCC optimize("-finline-small-functions") 42 %:pragma GCC optimize("-ftree-switch-conversion") 43 %:pragma GCC optimize("-foptimize-sibling-calls") 44 %:pragma GCC optimize("-fexpensive-optimizations") 45 %:pragma GCC optimize("-funsafe-loop-optimizations") 46 %:pragma GCC optimize("inline-functions-called-once") 47 %:pragma GCC optimize("-fdelete-null-pointer-checks") 48 49 #include <bits/stdc++.h> 50 using namespace std; 51 const int N = 5e3 + 10, P = 1e4 + 10; 52 53 int n, p, f[N][P]; 54 55 int w[N], val[N], cnt, dfn[N], sz[N]; 56 57 int head[N], rest[N * 2], to[N * 2], tot; 58 59 void add(int u, int v) { 60 to[++ tot] = v, rest[tot] = head[u], head[u] = tot; 61 } 62 63 void dfs(int u) { 64 sz[u] = 1; 65 for(int i = head[u] ; i ; i = rest[i]) { 66 int v = to[i]; 67 dfs(v); 68 sz[u] += sz[v]; 69 } 70 dfn[++ cnt] = u; 71 } 72 73 int main() { 74 freopen("medicine.in", "r", stdin); 75 freopen("medicine.out", "w", stdout); 76 scanf("%d%d", &n, &p); 77 for(int i = 1 ; i <= n ; ++ i) { 78 int f; 79 scanf("%d%d%d", &w[i], &f, &val[i]); 80 if(i != 1) add(f, i); 81 } 82 dfs(1); 83 for(int i = 1 ; i <= n ; ++ i) { 84 int u = dfn[i]; 85 for(int j = 0 ; j <= p ; ++ j) { 86 int x = 0, y = 0; 87 x = f[i - sz[u]][j]; 88 if(j - w[u] >= 0) y = f[i - 1][j - w[u]] + val[u]; 89 f[i][j] = max(x, y); 90 } 91 } 92 printf("%d\n", f[n][p]); 93 }