暑假集训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)\) 暴力,我们发现转移方程比较显然就是

\[dp_{i,j}=dp_{k,j-1}+(S_{i}-S_{k})\mod p \]

我们尝试对其进行优化,我们试图将这个递归式展开,发现它变成了题面那样子:对序列分段。我们发现整个序列的和是一定的,所以只要尽量让每一段除以 \(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. 删除一个数
  3. 查询最大值和次大值

这个平衡树可以随便做,但是为了减小常数这里选择用堆

对于操作二,我们可以通过开一个删除堆来维护,如果删除堆的顶和插入堆的顶一样的话,直接弹出就好了

所以我们现在在每个节点上要维护两个可删堆,分别是

  1. 维护当前连通块内的点到其点分树内重心的最大距离
  2. 维护其点分树上儿子中 堆 \(1\) 的顶端的最大值和次大值

每次更改这两个堆,通过 堆 \(2\) 的信息更新答案,扔到另一个堆里面

tips:记得在 堆 \(2\) 中插入自己

复杂度 \(O(n\log^2n)\)

posted @ 2024-07-25 06:37  wang54321  阅读(5)  评论(0编辑  收藏  举报