CF974 Review

CF974 Review

(以后比较简单的题就不写了)

A B C

skip

D

个人写了 O(nlogn) 的类模拟算法,能过,但不能做到 O(n)

考虑什么时候一段 [st,st+d1] 的时间会和某一段区间有重合,也就是我自己写的算法的核心思想其实。

那就是 st+d1listri ,变形一下就可以得到 lid+1stri ,也就是会对所有满足开头 st 在上述范围内的答案产生 +1 的贡献,那么直接进行差分数组区间加就可以了。

E

仍然是普通的最短路,但是到了某些节点之后(有马),就可以使得之后的前进过程都只消耗 w/2 的代价,并且是两个人同时出发,最后在一点汇合(可以停下等待)。

后者非常好解决,我们只需要跑两次最短路,然后枚举中间汇合的点就好了。

那么如何处理前者?就要用到分层最短路。

对于任何一个有马的节点,我们都向更高一层建一条边,而更高一层的所有边权都是底层对应的一半。最后的最短路就是两张图取一个 min 就行。

F

一道很基础的树形dp,当时前四道题交了六发罚时心态爆炸没看后面了。

实际上我也不知道我能不能做出来,虽然这个树形dp确实贴脸上了。

定义 dp[x][0/1] 为当前点 x 选/不选,能得到的以 x 为根的子树的最大价值。

由于考虑的是一个树形结构,所以如果要选择当前节点,我们只用考虑它向下的影响,因为之后我们会在他的计算他的父亲时考虑它向上的影响。

当然还需要注意的就是我们只会统计维修过的节点,因此如果一个节点的状态是没有维修,也就是 dp[x][0] ,那么附近的节点是不会对它产生 c 的影响的,所以只有当一条边连接的两个点状态都是 1 的时候才会考虑 c ,而且是 2c 。转移过程如下(直接贴代码了):

F G

还没改(估计鸽了

posted @   Hanggoash  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!
动态线条
动态线条end
点击右上角即可分享
微信分享提示