2023.2.16 省选模拟赛总结

1.时间安排

7:30~8:00

T1 位运算相关的题 T2 树上点集相关的计数题 T3 维护树上同色连通块的数据结构题

先想T1,位运算相关很容易想到拆位,序列的每个位置都可以对应到初始序列的一段区间分别与组合数相乘再求和,又因为提前拆位,所以可以用模 2 意义下的lucas定理,即 \(C_n^m=1(mod 2)\) 当且仅当 \(m\in n\),也就是 \(m&n==m\)

这样就有了个 \(O(n2^{ones(k)}logn)\) 的线性空间做法,一时没想到怎么拓展,再想想T2。

T2 是比较套路的容斥,用全部的答案减去lca不是当前节点的方案,全部的答案是 \(2^{sz(x)}\),减去的方案可以枚举所有子节点,那么就需要减去 \(1+\sum_{y\in son(x)}{2^{sz(y)}-1}\),直接预处理2的幂即可。

想了想没什么漏掉的情况,写完过了样例,计数题一般过样例就没啥问题了,就提交放一边了。

8:00~9:10

感觉拆位的道路行不通了,仔细一想可以把求和改成异或,就可以避免掉拆位,于是复杂度变成了 \(n2^{ones(k)}\)

写到这里突然意识到,自己在做的事情是把数组整体跳 \(k-1\) 步,优化跳步联想到倍增,于是可以把 \(k-1\) 二进制分解,这样每次跳每个位置只需要枚举初始数组的两个值,然后把初始数组覆盖为新数组,总共要跳 \(logk\) 次,每次计算 \(O(n)\),总时间复杂度 \(O(nlogk)\),空间复杂度线性。

写完与暴力对拍没问题,造了极限数据也能跑动。

9:10~12:00

先把T3的dfs暴力写了,造了一些小的卡边数据没什么问题,也方便后面的对拍。

对于是链的情况,黑白连通块只可能是一段区间,那么用两个set分别维护黑白点,就可以 \(log\) 时间内找到对应区间,再进行线段树区间加区间查max操作,很好写,写完能和暴力拍上。

接下来在树高 \(\leq 10\) 和没有 4、5 操作两个分徘徊,树高 \(\leq 10\) 似乎没什么发挥空间,但是没有 4、5 操作就是单纯的同色连通块修改、查询、分裂、合并,联想到 QTree 7,但是现在我需要维护的操作还多一个子树加,lct维护子树相当难,冷静推了推,感觉推对了,画了个简单的lct模拟一下感觉没问题,就开始了lct+可删堆的大工程。

一直写到比赛结束也没能调出来,过程中发现如果没有子树加操作能和暴力拍上,问题出在了子树加,还是对lct对于子树的维护技巧不熟练。

result:

T1:100 T2:100 T3:40

2.总结

T1、T2:略。

T3:

还是要找一找lct维护子树的技巧,要不写出来100+行的lct不能用就太悲催了。

正解一种是top tree,一种是线段树,限于能力只讲解线段树做法。

本题对维护同色连通块感觉很有启发性,很值得总结一下。

既然有子树加和路径加,那么重剖是必不可少的,有了重剖4、5操作时容易的,关键在于怎么维护前三种操作。

为了让重剖的节点有独一无二的意义,我们定义同色连通块的根是该连通块内深度最小的点(容易发现存在且唯一),那么这个点在树剖中维护的东西就如上。

这个根可以通过每个重链维护一个平衡树 \(std::set\),就可以在 \(log\) 时间内找到,并且可以在 \(log\) 时间内进行修改。

很明显一个连通块会对应到重剖 dfs 序的若干个区间,暴力枚举这些区间并维护复杂度是不对的,我们希望如果能想办法处理成子树加和子树查就能做到的东西就方便了许多,而正解就是在这个思路上构造的。

现在仅考虑白色连通块,那么黑色点相当于把白色块分成了若干层,我们就考虑能否利用黑色的天然分层处理信息。

我们在黑色线段树上维护每个黑点覆盖了哪些位置,注意这里要进行标记永久化,即只 push_down 不 push_up,这样做的目的一方面是能维护出每个位置被覆盖了多少次,另一方面是保证了线段树上从根开始向下走覆盖次数递增,下文会用到。

那么我们可以查询出当前要做操作的白色的根rt在黑色线段树上被覆盖了多少次,我们把这个定义为rt所在的层,即为 cov。

那么在白色线段树上,我们维护的是白色点的点权信息,现在,我们只需要找到在rt的子树内并且层数与rt相等的区间进行操作即可。

因为从根想下是递增的,所以我们可以用黑色线段树上节点覆盖次数是否 \(\leq\) cov来判断是否需要向下递归。

同样的,在push_up的时候,父亲也只维护和自己层数相同的子节点信息。

这样,我们从子树dfs序和覆盖层数两个维度将所有白色连通块区分开,就可以大胆维护操作了。

不过,标记的传递也有细节,如果是连通块的修改注意下传标记只能给覆盖次数相同的节点,但是4、5操作的标记并没有连通块的限制,所以不需要考虑层数的限制。

黑色处理方法同上,维护两棵线段树相辅相成。

这样的分层处理感觉可以拓展到非常多的同色连通块问题,很值得记忆。

posted @ 2023-02-16 19:58  Displace  阅读(34)  评论(0)    收藏  举报