Examples

2022-12-7 #5 明白你不愿放弃的爱 现在沿途的风景依然精彩

——校长《明日DISCO》

今天看了看 Stern-Brocot 树,发现啥都不记得了。

性质:二叉搜索树,最简性、唯一性、覆盖性。

(a,b),(c,d) 以某种方式相邻的充要条件是 |adbc|=1

从根结点到结点 ab 只需跳跃 O(logmax{a,b}) 条相同方向的链。

注意一棵子树 (a,b),(c,d) 到左、右儿子的移动是线性变换,可以用矩阵刻画。(结合上面的性质,跳跃相同方向的链可以矩阵快速幂)

还有一种理解是把分数理解成平面向量,分数值即为斜率。

双曲线下整点计数 DIVCNT1

P8058 [BalkanOI2003] Farey 序列

21 ABC273Ex Inv(0,1)ving Insert(1,0)n

只需建出 n 个分数在 SBT 上的虚树,然后统计每个点被统计的次数,这个可以使用启发式合并解决。

递归建立虚树,若当前点是一个分叉点,直接递归左右,否则要跳一段相同方向的链,类似解一个 a+kcb+kd>pk 最大值,O(1) 计算即可。

22 ARC123F Insert Addition

尝试将其向 SBT 上靠,我们用一个数对 (u,v) 表示一个整数 p=au+bv,这样生成的序列就是 SBT 的形式了。

我们在 SBT 上跳,先找到 L 对应的位置,然后直接 dfs 就可以输出剩下数了,由于树深度不超过 n,我们只会遍历到最多 n+RL+1 个数。

问题在于计算一棵子树 (p,q) 的大小,我们使用莫比乌斯反演:

d=1nμ(d)i=1ndndipq

容易 O(nlogn) 计算,也可以数论分块+类欧几里得 O(nlogn)

注意跳相同方向的链需要倍增地跳,复杂度 O(n+nlog3n)

23 ARC149F Rational Number System

建立所有数的 trie 树,与上一题类似地在 trie 树上遍历。

二分走哪个儿子,问题转化为 [l,r] 子树大小之和,这个枚举一下深度就做完了。

24 P8258 [CTS2022] 独立集问题

注意到某个位置操作了之后,我们可以给它再操作一次来取反。于是问题可以刻画成:操作一个点,就将它的点权减它附近的点的点权和的绝对值(由于答案是求最大值,这个绝对值可以拆)加入答案,并把操作到的点的点权归零。

这样就可以直接 dp 了,细节较多。

24 P8860 动态图连通性

先离线,原问题等价于一个最短路,其中第 i 次操作被删除的边赋权 2qi+1(有多次操作只考虑第一次),其余赋权 0

直接 dijkstra,使用主席树维护即可做到 O(nlogn),但空间不优秀,也不优美。(类似 CF464E)

事实上这题是比 CF464E 弱的,因为非零边权互不相同,也就是说不会出现“进位”的情况。

主席树的作用主要是比较 diss1+w1diss2+w2 的大小,不妨令 diss1<diss2,那么 diss1+w1>diss2。(否则我们都不需要考虑 s2

于是 w1 一定是加在了 lcp(diss1,diss2) 中的某个 0 上,那么若 w2w1,则 diss2+w2 更小,否则 diss1+w1 更小,也就是我们只需比较最后一步的边权。(若边权相同,此时 di=0,我们可以任意处理)

于是做到了线性空间,以及极低的实现难度。

25 ABC279Ex Sum of Prod of Min

这个 min 对应的 GF 可以直接列出:(一个差分状物)

Ft(x)=imin(t,i)xi=xxt+1(1x)2

答案即:

[xm]i=1nx(1xi)(1x)2=[xmn](1x)2ni=1n(1xi)

由于 mnn,所以求积式的上界可以忽略,此时我们应用五边形数定理:

[xmn](1x)2nk(1)kxk(3k±1)2

右边只有 O(n) 项,枚举一下,左边 O(1) 提取系数就好了。

26 ABC275Ex Monster

建出笛卡尔树,一次操作只会操作笛卡尔树的一棵子树。

Fu(x) 表示 u 子树中,操作到最大值为 x 的最小代价:(特判掉叶子)

Fu(x)=minymax(Au,x){Bu(yx)+vson(u)Bv(y)}

归纳可知 Fu 凸,使用 slope trick,仅维护斜率变化点以及变化量。

先将儿子的 F 加起来,然后分阶段完成转移:

Fu(x)Fu(x)+BuxFu(x)minymax(Au,x)Fu(y)Fu(x)Fu(x)Bux

第一、三步只需插入斜率变化点,第二步将 <Au 的斜率变化点、以及斜率小于 0 的一段前缀拍平。

使用左偏树维护即可做到 O(nlogn)


【星尘infinity】零重祈愿

草,大意了,下午晚上都在摆。

27 P7605 [THUPC2021] 小 E 爱消除

比较简单,列出区间 dp,讨论左端点与哪个位置匹配,这样转化为“[l1,r1],[l2,r2] 这些球消掉需要的最小栈大小”,这也可以区间 dp 解决。

复杂度是 O(n6) 的,但是注意到很多情况都不合法,出题人表示其有 1720 的常数。

28 loj#6610. applese 爱数图

考虑将整张图分解成 k 个点双 S1,2,,k,记 G 的生成树个数为 F(G),有:

F(G)=i=1kF(Si)

简单地考察某一个点双的 F 值:

  • |E|=|V|,此时一定为圈,F(G)=|V|
  • |E|=|V|+1,此时一定为圈上任选两个点连一条路径,此时有两个三度点,记三条路径长度分别为 a,b,c,那么 F(G)=ab+bc+ac3n4。(a=1,b=2,c=n2
  • |E|>|V|+1:这个我还不会证,反正其 F 值也不少于 3n4

因此,一个非平凡点双(|V|>1)的贡献一定 3,因此最多有两个非平凡点双。

那么开始分讨:

不存在非平凡点双:此时是一棵无根树,nn2

一个非平凡点双:

  • 圈:直接计算圆排列,(n1)!2
  • 非圈:此时 22F3n4,那么 n8,暴力枚举所有不超过 8 个点的无向图即可。

得到这个点双后,我们只需与其余的点组合起来,通过 prufer 序列“图联通方案数公式”,贡献即 nn|V|1|V|,带上一个组合数选出这些点。

两个非平凡点双:

我们可以直接枚举两个点双,计算组合在一起的方案数。观察到两个点至多有一个公共点,分讨计算即可。

复杂度其实不是很重要,大概是 O(k2logn+k4)

29 P5538 【XR-3】Namid[A]me

比较套路?

首先注意由于模数较小,可以通过预处理离散对数做到 O(1) 快速幂。

一个直接的想法是点分治,根据经典结论,一条链上,左端点到任意点的 f 值只有 loga 种。那么以分治重心为一端的 f 值只有 O(dloga) 种。

不妨考虑暴力枚举两种 f 值拼起来,这样的复杂度是 O(min((dloga)2,n2))O((ndloga)2)=O(ndloga) 的。

事实上你回过头看,这个点分治的结构是毫无必要的,我们只是根据习惯使用了这一手段,把每条路径在 lca 处计算也是等价的。

另一种处理方式是将每个叶子依次设为根,根据经典结论,任意路径都会至少一次作为直链出现。尝试在直链的底端统计路径,即统计“在以 di 为根时是直链,以 d1i1 为根时不是直链”的路径。

假设路径 uv 被统计到了(u 是祖先,令 wuv 路径上第二个点),那么 d1i1 一定都在 w 的子树内。于是我们对 u 的限制仅为“深度大于等于某个值”。转化为直链后使用上面的结论可以直接 O(ndloga) 解决。

posted @   xiaoziyao  阅读(165)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
点击右上角即可分享
微信分享提示