A
我唐氏了,原来分层图后可以变成 DAG 少一只 log。
B
一场比赛有 \(n\) 人参加,已知第一天第 \(i\) 个人得到了 \(A_i\) 分,且分数互不相同,第二天每个人的得分将是一个 \(1\sim n\) 的排列,比赛的排名按两天的总分从大到小排序(有同分则随机排序)。给定 \(P\) 求符合以下要求的三元组 $\left (x,y,z\right ) $ 的数量:
当 \(P=1\) 时,\(A_x>A_y>A_z\);当 \(P=2\) 时,\(A_x>A_z>A_y\),且第 \(x,y,z\) 个人在第二天结束后可能分别获得第一二三名。
考虑 \(P=1\),假设我们已知 \(x,y,z\) 考虑是否合法。
考虑给 \(A_z,A_y,A_x\) 分别赋 \(n,n-1,n-2\),因为 \(A\) 不同相同,显然最小的还是 \(A_z+n\)。
那么 \(A_z+n\) 不小于其他没选的就行了,没选的从大到小赋 \(1\sim n-3\),最大值显然为 \(A\) 最大值 \(+1\)。
枚举没选的最大值是谁,只有前 \(4\) 大的可能。考虑 \(A_z+n\ge A_{max}+1\) 即可。
考虑 \(P=2\),不难发现只要再满足 \(A_z-A_y\le n-1\) 即可,不知道怎么回事但是蒙对了。
C
一个序列 \(a\),以及 \(q\) 个区间,你可以将 \(m\) 个 \(a_i\) 赋 \(0\),问所有区间最大值的和最小是多少。
\(n,m,q\le 50\)。
区间最大值考虑笛卡尔树状物,那么考虑区间 dp 每次删掉区间最大值并计算跨越这个位置区间的答案。
设 \(dp_{l,r,k}\) 表示 \([l,r]\) 内的区间的答案,还可以赋 \(k\) 个 \(0\),且 \([l,r]\) 区间所有数操作后的值不超过父亲。
区间 \([l,r]\) 在笛卡尔树上的父亲显然为 \(\min(a_{l-1},a_{r+1})\)。那么我们下一个选的最大值不超过这个值。
考虑赋 \(0\) 操作,我们可以花费一个区间长度的代价把其中区间全部赋为 \(0\)。
D
一棵树一开始每条边权为 \(1\),\(q\) 次询问 \(k\),求进行 \(k\) 次将某条边权 \(+1\) 后直径最小值。
直径考虑取出直径中点。如果直径中点在边上那么就中间插入点使得其在点上。
枚举直径中点,考虑当前叶子最深的为 \(R\),那么先将所有叶子加到 \(2R\) 深度。
然后每次将所有叶子连向父亲的边 \(+1\),可以进行叶子个数次操作。
显然叶子不会是直径中点,那么贡献是一个斜率固定的一次函数,扫一遍即可。