暑假集训CSP提高模拟4
暑假集训CSP提高模拟4
3/32
\(Yes \to YES\),\(100 \to 0\),\(rk1 \to rk3\)
😢😢😢😋😋😋😋
T1 White and Black
水,发现贪心策略,考虑枚举每个点和它的父亲
T2 White and White
乐,赛时写了树状数组的 \(O(nk\log p)\) 做法,狂取模不止,本来跑过了,结果被学长发现巨大常数,于是把所有树状数组全卡了
以一己之力造福两个机房
考虑一个 \(O(n^2k)\) 暴力,我们发现转移方程比较显然就是
我们尝试对其进行优化,我们试图将这个递归式展开,发现它变成了题面那样子:对序列分段。我们发现整个序列的和是一定的,所以只要尽量让每一段除以 \(p\) 向下取整的和更大,所以无脑选 \(dp_{k,j-1}\) 和 \(k\) 最优\靠前的转移就好了,简单来说就是 :假如一个决策 \(d\) 满足 \(dp_{k,j-1}=dp_{d,j-1},d>k\) 那么其一定不如 \(k\) 优,因为显然前面的更容易让总贡献减 \(p\),用个数组把每个 \(j\) 对应的最优决策 \(k\) 存下来就好了,复杂度 \(O(nk)\)
T3 Black and Black
构造题,就像开头那样,连样例分都没拿到
考虑部分分:-1和1必然组成一个合法的括号序列
这就意味着每个 \(1/-1\) 必然能和其前面的一个配对,那么答案不可能为 \(0\),puts("No")
即可获得 \(10\) 分高分
考虑一个构造方案,首先初始化序列为 \(1\sim n\),求出目前的答案,如果其就是 \(0\),输出即可吗,之后我们从后往前扫这个原序列后缀和,发现一但后面的 \(1\) 比 \(-1\) 多一,把后面这段区间加一相当于对答案贡献加一,反之同理,前缀后缀各扫一遍,如果没有对应的,说明整个串构成一个上述的无解串
T4 Black and White
赛时暴力就有 \(60\),取之
题解说了线段树维护点集的做法,我写写点分树
考虑不带修改:两遍dfs求完了 选定一个分治中心,对每个子树都暴力求出离其最远的点到它的距离,之后选定最大值和次大值合并即可得到该点答案,全局取 \(\max\) 即可得到最终结果
如果加上修改,我们发现我们改一个点至多影响 \(\log n\) 个分治中心的答案,现在我们要维护这样一个数据结构
- 插入一个数
- 删除一个数
- 查询最大值和次大值
这个平衡树可以随便做,但是为了减小常数这里选择用堆
对于操作二,我们可以通过开一个删除堆来维护,如果删除堆的顶和插入堆的顶一样的话,直接弹出就好了
所以我们现在在每个节点上要维护两个可删堆,分别是
- 维护当前连通块内的点到其点分树内重心的最大距离
- 维护其点分树上儿子中 堆 \(1\) 的顶端的最大值和次大值
每次更改这两个堆,通过 堆 \(2\) 的信息更新答案,扔到另一个堆里面
tips:记得在 堆 \(2\) 中插入自己
复杂度 \(O(n\log^2n)\)