补题:
https://codeforces.com/group/wmhDiB5PTN/contest/313189
题面
https://assets.codeforces.com/rounds/102896/nerc2020-statements.pdf
A
定义“Almost Balance Tree” 为一颗二叉树,
满足左右儿子的重量差不超过1,
给出A个1 B个2要求构造出合法的二叉树,无解输出-1
显然有,在2的数量一定的前提下,1越多就越有可能可以得到合法的树。
我们可以先算出在总和S=A+B*2的前提下,最少需要多少个1
那么令f[S]表示S最少需要的1个数,
考虑根为1、2进行转移
1:1+f【up(s-1)】+f【down(s-1)】
2: f【up(s-2)】+f【down(s-2)】
其中up(x)表示 floor(x/2) down(x)表示ceil(x/2)
那么只要1的个数足够,我们可以按照上述过程递归构造即可
注意特判边界,比如当前是全部为1可以直接构造等
C
一颗节点数
≤
20
\leq 20
≤20的树,一开始只有根节点染了色,
每次操作可以将一个点颜色取反,
要求操作完是染色部分是一个包含根的连通块
问最多可以进行多少次操作,
假如一个节点只有一个儿子,那么显然方案唯一
如果有两个儿子,我们一定可以遍历两个子树的所有情况
不妨设两个子树的状态分别为s1,……sn ,t1,……tm
则可以这样走
(s1,t1)->(s1,t2)->……(s1,tm)->(s2,tm)->……(sn,tm)或(sn,t1)
所以我们一定可以遍历所有情况
递归构造一下即可
D
给出N级台阶,每个台阶可以走到自己下面八级台阶的某些位置
第T天只可以走前T级台阶,问每一天两个人玩轮流走走不了的人输的游戏胜负情况
相当于一个有向图上的博弈,每次会往后面加点
显然我们如果确定一个点的后续状态的胜负状态
那么也可以确定该点的胜负情况
那么我们可以用f【x】【mask】表示
x级台阶后面八级台阶的胜负状态为mask时的状态
每次处理出最后八级台阶的胜负状态
往回递推,记搜即可
E
签到题,推式子即可
G
给出一个平面内的杨辉三角形,求一个三角形内部的数之和
枚举行n的话,相当于是求一段区间C(n,i)
发现相邻行之间可以转移
直接暴力算即可
K
签到题
L
给出一颗二叉搜索树,以及查找值域在【L,R】元素个数的函数,
每次询问给出【L,R】,问该函数调用次数
如上图所示,
红色为与区间【L,R】无相交的节点,
绿色为被区间【L,R】覆盖的节点
所以我们只要找到被包含的最靠左、右的蓝色节点即可
然后答案为2*(d【A'】+d【B'】-d【C'】)+1
其中A'、B'为上图左右两端的蓝色节点
C'为A'、B'的LCA
M
签到题,有向图最长路径
记搜即可