Codeforces Round 695 (Div. 2)

(3 mins to read)

A

有n个数字,同时从0开始,按照0~9的顺序循环,每一秒变化一次。现在可以暂停某个数字的变化,然后距离它x的数字会在x秒后暂停变化,问所有数字都暂停后的最大数字是多少。显然高位越大越好,发现操作第2个数字后可以使前三位为989,这样必然是最大的

B

给定一个数组a,如果$a_i\lt a_{i-1},a_i\lt a_{i+1}$​,或者$a_i\gt a_{i-1},a_i\gt a_{i+1}$​,则是坏的三元组,要求你至多修改一个数使坏的三元组个数最少考虑修改一个数,只会影响到以$a_{i-1},a_i,a_{i+1}$​这三个数为中心的三元组,在最优的情况下,$a_i$​的取值必然是$a_{i-2},a_{i-1},a_i,a_{i+1},a_{i+2},\inf,-\inf$这七种之一,暴力枚举一下(这边没细想,不知道只取$a_{i-1}$​或$a_{i+1}$​行不行)

C

有三个多重集,定义一种操作是,选择某个多重集中的数x,另一个多重集中的数y,然后删除这两个数,把x-y放到x所在的多重集中,让你最大化最后剩下的那个数的值我们可以让x去减掉所有的y,再让z去减掉x,那就相当于只损失了一个x先枚举剩下的那个数在哪个多重集中,必然是让最小的那个数当作x的角色,再考虑怎么去掉同一集合中的其他数t,可以选择另外两个多重集中的最小值mn,然后让t和mn中的较小者充当x的角色,这样损失就是$\min(t,mn)$。所以最小损失就是该多重集的最小值,以及该多重集的次小值和其余两个多重集的最小值中的最小值的和(有点绕。。)

D

一个人初始在1~n的任意一点,然后每次可以向左或者向右走一步,走k步后就形成一条路径$c_0,c_1,…,c_k$​,定义该路径的价值为$\sum_{i=0}^ka_{c_i}$​​,求所有不同的路径的价值和,要求支持单点修改$a_i$​先求出$dp_{i,j}$​表示第i步在j的方案数,我们可以发现这个dp的转移正向和反向是相同的,那么到$dp_k$​的时候$dp_{i,j}$​的贡献就相当于$dp_{k-i,j}$​,所以随便维护一下前缀和就可以$O(1)$带修了

E

给一棵带点权的无根树,一个点u作为根是合法的,仅当对于其它任意点v,u到v的路径上的点权均不同可以用换根dp来做固定1为根,先dfs一遍跑出$dp_u$​,表示只考虑u的子树时,以u为根是否合法。这个很简单,只要u的所有儿子v合法,且u的点权在子树中没有出现过即可。再考虑求出$dp2_u$​,表示考虑除去u的子树后的部分,以u为根是否合法。首先u的点权只能在u的子树当中出现,u的父亲fa的点权也只能在u的子树中出现,$dp2_{fa}$​要合法。此外对于fa,除去u点后其余儿子的dp要都是1。满足以上所有条件,$dp2_u$​就是1。最后当$dp_u=1$且$dp2_u=1$时,表明u是合法的具体实现需要用map启发式合并