2026/9/3 NOIP模拟赛
https://cplusoj.com/d/senior/contest/6a98295acccbc18957c75c3c
树 (tree)
CF1276D Tree Elimination
令 \(f_{u,0/1/2}\) 分别表示:
- \(u\) 在父边之前变成黑色。
- \(u\) 在父边变成黑色。
- \(u\) 在父边时还是白色。
考虑 \(u\) 子树内的转移:
先把边按照时间排序,转移:
- \(u\) 被染黑:\(f_{v,0}+f_{v,2}\)。
- \(u\) 还是白色:\(f_{v,0}+f_{v,1}\)。
- \(u\) 在这条边变成黑色:\(f_{v,2}\)。
枚举哪条边让 \(u\) 变成黑色,维护前后缀积。
冒泡排序二合一 (sort)
冒泡 \(k\) 轮后组成前 \(i\) 个数的集合为 \([1,i+k]\) 中的前 \(i\) 小。
- 第一问:找到最小的 \(j\) 满足 \(x\) 在 \([l,j]\) 的集合内,维护 \(<x\) 的主席树然后在序列上二分。
- 第二问:找到 \(x-1\) 和 \(x\) 之间的增量,要么是 \(a_{x+k}\) 要么是 \([l,x+k-1]\) 内的第 \(x\) 小。维护序列扫描线的主席树然后在值域上二分。
时空复杂度 \(O(n\log n)\)。
概率(pr)
只用求相等的概率。
那么考虑令右侧的值域为 \([-m,0]\),然后偏移值域。也就是要求 \([x^{nm}] (\frac{1-x^{m+1}}{1-x})^{2n}\),直接展开分子,复杂度 \(O(Tn)\)。
神谕(oracle)
一个没写完的巨大做法:
首先怎么定位 \([l,r]\) 涉及到的线段树节点:他们是 \(l-1\) 祖先链上的右儿子,和 \(r+1\) 祖先链上的左儿子。
所以可以对于 \(LCA(l-1,l),LCA(r,r+1)\) 的祖先链进行 pushdown,然后对于 \(l-1,r+1\) 祖先链上的右/左儿子进行 addtag,需要对于 \(LCA(l-1,r+1)\) 进行差分,然后再有一个单点修改。
所以需要支持:
- pushdown(u):对于 \(u\) 的所有祖先进行 pushdown 操作。
考虑重剖,重儿子的 tag 先做前缀和,然后下放到轻儿子。对于轻儿子只有 \(O(\log n)\) 个,单点修改下放到重链的 tag。 - addtagL/R(u):也是重剖。重链给轻儿子打特定方向的 tag。
所以只有轻儿子需要接受父亲发下来的 tag,这样复杂度就是有保证的。
时间复杂度 \(O(n\log^2 n)\)。
能不能更厉害一点!
考虑当前询问节点 \(u\),他的 tag 来自于:
- 父亲 pushdown 下来的。
- 自身没有被 pushdown。
找到上一次 \(u\) 被 pushdown 的时间 \(t\),以及上一次 father pushdown 的时间 \(t'\)。
那么答案就是 \(F(t',[l,r])-F(t,[l,r])\),其中 \(F(t,[l,r])\) 表示前 \(t\) 次操作中与 \([l,r]\) 有交的操作之和。
类似上面,我们可以定位成两个链 pushdown,这样可以查询单点查询子树内 pushdown 时间最大值来求出 \(t,t'\)。
然后是查询有交的操作之和,可以计算无交的和,离线,使用树状数组维护单点加区间查询即可。
然后要注意一开始还有叶子的贡献。
\(O(n\log n)\)。
浙公网安备 33010602011771号