视频讲解:
A题:https://dev.xjoi.net/video/f9951686196c45418deae840180b3959
B题:https://dev.xjoi.net/video/52445289359b4db69ec269d08f2dd7c1
C题:https://dev.xjoi.net/video/26e27784173a4a6a905d28c9ad87a0ef
D题:https://dev.xjoi.net/video/3946d32b2937455197eb390aa40eccb8
E题:https://dev.xjoi.net/video/db9201cd7bf54dd6bcdcc1a93aa6dad7
A 核酸检测
略。
B 齐心抗疫
分析题目所求,只要算出max(a[i] * dis[i])即可。
其中,a[i]为点i的权值,dis[i]为从点i出发的最大深度。
易证,a[i]如果小于a[j],则a[i] * dis[i] < a[j] * dis[j],不会对最终解造成影响。
dis[i]有一种巧妙的求法
1、以任意点求一遍dfs
2、以深度最大点求一遍dfs
多求一遍逆序dfs,第一遍dfs忽略的路径就会被算上。
C 病毒研究
状压dp,dp数组维护的是[l, r]区间的费用和,状态数优化至O(n)。
f[i][0]维护区间[i, a[i]],f[i][1]维护区间[a[i-1]+1, i],sum数组维护中间完整的区间,用以前缀和优化。
转移方程:dp[l, r] = f[l][0] + sum[pre[r]] - sum[nxt[l]] + f[r][0]。