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)\)

posted @ 2026-09-03 14:59  TallBanana  阅读(12)  评论(0)    收藏  举报