Live2D

Solution Set - “请背诵每条魔法的禁忌”

Defining LATEX macros

0.「HAOI 2018」「洛谷 P4494」反色游戏

  先判无解: 对于一个连通块, 若黑点数量为奇数, 则一定无解. 此后, 对每个连通块, 取出任意一棵生成树用作最后调节, 其他边任意选. 一个 s 个点 k 条边的连通块的方案数为 2ks+1. 当然, 判断完有解性后, 可以直接用 2mn+c 计算方案, 其中 c 即连通块数量.

  怎么求每个点删除后的答案呢? 和连通性有关, 建出圆方树, 此时圆点的邻接方点数量就是这个点删掉后新增的连通块数量, 搜几遍就行. 复杂度 O(T(n+m)).

1.「JSOI 2010」「洛谷 P6029」旅行

  比较常见的 "钦定贪心结果" 的 trick.

  当路径的边权序列已知时, 我们一定会将其中最大的若干个权替代为没有出现的最小的若干个权, 最后的效果是, 在所有边权升序排列的序列中, 贡献答案的边权占据了一段前缀和后面离散的单点.

  钦定这段前缀的长度 , 这样我们就只需要考虑 "能不能交换" 而不需要考虑 "换成什么东西" 的问题了. 令 f(u,c,k) 表示走到 u, 有 c 条本来就路径上且排名 的边, 进行了 k 次交换后, 排名 > 的边权和最小值. Dijkstra 转移即可. 复杂度 O(m2nklog(mnk)), 下意识整点剪枝就稳过了.

2.「CTSC 2017」「洛谷 P3774」最长上升子序列 ⭐

  Dilworth 一发, 取出 C 的要求等价于可以划分为不超过 k 条不上升链, 接下来用 RSK 插入算法增量地维护杨表即可. 注意我们只关注杨表的长相, 所以可以通过维护前 n 行 "" 杨表和前 n 列 "<" 杨表就能降低复杂度. 平衡一下瓶颈可以做到 O(nnlogn+q).

  Mark 一下: 杨表, 学过力!

3.「CTSC 2018」「洛谷 P4566」青蕈领主 ⭐

  • Link & Submission.
  • 「A.数学-生成函数」「A.数学-多项式」「A.数学-组合计数」

  称题目中定义的 "连续段" 为紧凑段. 两个跨越的紧凑段显然可以合并为一个更大的紧凑段. 所以有解条件为: i, j[ii+1,i], jjii. 全局来看, 从 n 开始的极长而不交的紧凑段把排列划分称若干个独立的部分. 我们只需要为求出分配每段元素的方案, 然后递归求解就行.

  问题转化成, 给定 s1,s2,,sk, 求把 m=s 阶排列划分为如是大小的紧凑段, 且不存在相邻若干紧凑段可以合并的方案数. 当然, 这也等价于把 k 阶排列划分为不存在 [2,k1] 的紧凑段的方案数. 定义该方案数的 GF 为 F(z).

  令 P(z)=i1i!zi, 则

P(z)=zF(P(z))+z.

Q(z)P(z) 的复合逆, 那么

F(z)=zQ(z)1.

接下来只需要求 Q(z). 显然 P(z) 是 D-finite 的, 其满足 ODE:

z2P(z)+z=(1z)P(z).

代入 Q(z):

Q2(z)Q(z)+Q(z)+z(Q(z)1)=0,Q2(z)+(1+z)Q(z)Q(z)zQ(z)=0.

所以

i=0n(qiqni+(i+1)qniqi+1+iqniqi)nqn=0,qn=nqn1+i=2n1i(qi+qi1)qni+1.

分治 FFT 即可. 复杂度 O(nlog2n+Tn).

  啧, 想清楚 CDQ 的贡献关系, 注意这种分治一般需要对 l=1 特判.

4.「CTSC 2008」「洛谷 P4528」图腾

  注意我们只需要求出两种图腾之差, 可以猜测这个问题严格弱于分别求出两种图腾数量. 也就是说, 我们可以也不得不整体考虑这个差值, 通过一些容斥抵消贡献.

  其实构造结果是很多样的, 关键在于能否得到一个全部可以求出来的式子. 经过一系列枚举, 得到

1,3,2,41,2,4,31,4,3,2=1,?,2,?+1,3,?,?1,?,?,?+1,2,3,4.

  我们来算右侧式子.

  • 1,?,2,?: 在 1 位置统计贡献, 维护一个以 2 位置的值为坐标的动态开点线段树就行.
  • 1,3,?,?: 在 3 位置统计贡献, 注意 4(1,3,2) 是独立的, 前者就是比 3 大的数的数量, 后者是跨过 3 且较大者小于 3 的顺序对数量, 可以用同样结构的线段树维护.
  • 1,?,?,?: 后面大的数中选三个.
  • 1,2,3,4: 三个 BIT 一层一层累加贡献.

  最终可以 O(nlogn) 完成. 注意取模可以自然溢出, 线段树 (在适当预处理后) 可以换成 BIT, 但我两个地方都写得很丑, 慢飞了.

5.「SDOI 2017」「洛谷 P3779」龙与地下城

  • Link & Submission.
  • 「A.数学-统计数学」(热烈祝贺新 tag 产生! 虽然第二道题绝对遥遥无期.)

  我说:

ans=abi=r[zi](1za1z)b=ab[zrz1](1za)b(1z)b+1.

  你说: 算得出来个棒子.

  数学教材上只摆了个正态分布的概率密度函数, 这波应该是教材编者大失败. (

  以前的数学书上给出过结论, n 个独立同分布的随机变量 X1,X2,,Xnn 足够大时, 其加和仍近似正态分布. 设 X=i=1nxinμnσ, 则 n 足够大时, 有 XN(0,1). 此时, Pr(X[,r]) 就可以在概率密度函数上 Simpson 积分近似求解.

  那么 n 小的时候呢? 直接 FFT 就行.

6.「JSOI 2018」「洛谷 P4558」机器人 ⭐

  • Link & Submission.
  • 「A.DP-计数 DP」「C.思维」「C.性质/结论」

  大型结论题, 挺厉害的.

  首先肯定尝试手画一些合法路线, 可以观察到我们几乎是用一条折线在图上平移得到完整路径, 因此可以发现第一个结论:

  • 所有 x+y 值相等的格子填入的箭头相同.

  证明方面, 注意到 (模意义下) 仅有 (x1,y)(x,y1) 可以走到 (x,y). 若 (x1,y)(x,y1) 方向不同, (x,y) 就不可达.

  事实上, 这一结论可以从证明过程得到推广: 任意格子走过 (1,1) 或者 (1,1) 的位移后到达的格子都与之设定了相同方向. 因此, 模意义下的 "副对角线" 将 nm 个格子划分为 gcd(n,m) 条斜线, 每条斜线上的方向设定都应该相同. 行走折线也一定存在长度为 d=gcd(n,m) 的周期.

  设一个长为 d 的周期内, 行走折线有 a 步向下, b=da 步向右. 那么, 行上的周期是 lcm(n,a)/a, 列上的周期是 lcm(m,b)/b, 而回到 (0,0) 时需要经过所有格子, 所以

lcm(lcm(n,a)a,lcm(m,b)b)=nmdngcd(n,a)mgcd(m,b)gcd(ngcd(n,a),mgcd(m,b))=nmgcd(n,m)gcd(ngcd(m,b),mgcd(n,a))=gcd(n,m).

一方面, 左侧因子已经严格包含了右侧的对应因子, 而左右相等, 所以我们要求

gcd(n,m,a,b)=1gcd(a,b)=1.

另一方面, 将选择左侧一项与右侧结果同时约掉 gcd(n,m), 我们有

gcd(ngcd(n,m)gcd(m,b),mgcd(n,a))=1gcd(ngcd(n,m),a)=1,

加之 ab,a+b=gcd(n,m), 所以

gcd(n,a)=1.

同理,

gcd(m,b)=1.

整理一下, 我们得到第二个结论:

  • gcd(n,a)=gcd(m,b)=1 (gcd(a,b)=1 是它们的必要条件).

  描述完合法路径, 接下来就可以引入障碍物求答案了. 我们暴力枚举 (a,b), 求出 g(x,y) 表示若走到了 (x,y), 最多能够走多少步. 显然一条路径中 g 的最小值就是该路径长度. 再设 f(x,y,s) 表示确定了周期中的 x 步下和 y 步右, 最小 g 值为 s 的方案数, 枚举下一步方向转移即可. 复杂度毛估 O(Tσ1(n)n3) (n,m 同阶), 肯定跑不满嘛!

7.「UR #4」「UOJ #52」元旦激光炮

  设三个序列被拿走的长度分别为 a,b,c, 则一定有一者 k/3, 我们直接检查这个位置上的三个数, 最小的那个数一定被拿走, 如此迭代. 操作次数 3log1.5n±O(1).

8.「CTSC 2011」「洛谷 P5841」字符串重排

  我代替 crashed 表达对这道恶心题的控诉.

  第一问 brainless: 直接按照字典序排序就是最优. 更 extensible 地讲, 任意 Trie 上的 DFS 序都满足第一问条件. 这里, 在每个串末尾加一个特殊字符, 就能把所有串挂在叶子上, 方便后续讨论.

  接下来, 我们需要完成对 q 次串连请求的判断处理. 从 DFS 序的视角看, 我们需要维护每棵子树的既定进出顺序. 对于每个点 u, 其儿子会被已经接受的请求串连成若干条链, 我们先判判判判掉 LCA 处两个点能否串连到一起, 在对每条数值路径判判判判一下爬上来的子树能否作为链的起点/重点. DSU 维护一下两个儿子是否属于同一条链, 再维护全局前驱后继链表就能暴力且痛苦地完成这一点.

  好消息是, 改成正解 (也许) 并不复杂, 更新是均摊的, 我们只需要快速进行可行性检查. 对每个点维护其最高爬到哪里就不能作为链的起点/终点即可. 更好的消息是, 上面那个暴力已经能过了.

9.「UR #6」「UOJ #76」懒癌 ✡️

  著名的红眼睛蓝眼睛问题在一般关系图上的形式, 神题!

  首先回顾经典: 若可视关系是完全图, 如何计算答案. 考虑:

  • 若有 1 条坏狗, 那么这条坏狗会四顾心茫然, 然后在第一天被毙.
  • 若有 2 条坏狗, 那么第一天两条坏狗都看见了其他坏狗, 相安无事. 第二天, 两条坏狗惊觉 "你咋还没去世", 而后察觉自己的身份, 双双被毙.
  • 如此归纳, 若有 k 条坏狗, 它们会在第 k 天同时被毙. 因此两个答案都是 n2n1.

  回到原题, 面对任意关系图, 悲从中来, 相顾无言. 能做?

  不妨从简单的完全图开始, 看看一条狗狗被毙前一天的心理活动: 它会先假设自己是好狗, 发现与事实 (没有狗被毙) 相悖, 于是发现自己是坏狗, 继而在第二天被毙.

  在完全图上, 狗与狗的信息是几乎相同的, 我们只关心一条狗狗知道多少条坏狗, 就能为它定夺生死. 但在一般图上, 狗与狗的悲欢并不相同, 我们自然就想到直接用集合来描述狗眼中的世界.

  具体来说, 假设实际上的坏狗集合为 S, 我们显然只需要关心这些狗狗的心理健康. 对于 uS, 它会假设自己不是坏狗, 然后和 "是否开枪" 这一可观测事实对照. 设 f(S) 表示坏狗集合为 S 时的开枪时间, f(S,u) 表示 uS 的条件下察觉到自己是坏狗的最快时间, 那么

f(S,u)=maxT{f(T)}+1.

这个 T 要满足什么? 只需要不和 u 的信息相悖就行. 设 u 的可观测狗集合为 Au, 那么 TAu=SAu, 且 uT.

  另一方面, f(S) 显然就是坏狗最早发现自己身份的时间, 即

f(S)=minuS{f(S,u)}=minuS{maxT{f(T)}+1}.


  接下来, 我们需要优化这个挺暴力的 DP. 为方便讨论, 我们把图取反, 此时 u 在转移时就能任意设定 Au¯ 的状态. 边界点自然就是 Au¯=, 也即开了天眼可以看到所有其他狗的狗狗. 当然呢, 转移也不总是顺利进行: 对于反图中的非单点强连通分量 C, 若 uSC, 则 S 必然会转移向一个 S, 仍满足 SC. 转移有环, 推理也就无法结束.

  我们去掉所有能走入这样的 SCC 的点, 此时便得到了一个 DAG. 转移在图上其实有比较简单的组合意义:

  初始时, 点集 S 内的点被染黑. 每次将一个 uS 染白, 将邻接点 Au¯ 的任意子集染黑, S 为空时到达边界. 此时操作方案相当于转移路线, 操作次数也就是贡献的转移数值.

  继续对应细节, max 对应于尽量延长 "选择子集" 时的转移路线: 直接选全集 Au¯. min 对应尽量缩短 "选择 u 点" 时的转移路线: 沿着拓扑序选择, 保证每个点只被染白一次. 因此, f(S) 就是所有被染黑过 (或被重新染白过) 的点数, 也就是初始时 S 可直接或间接到达的点数. 最后被毙的狗狗就是这些被染黑过的点.

  Finally, 设 ru 表示能直接或间接到达 u 的点, 则第一问的答案为 u(2ru1)2nru, 第二问的答案为 u(2ru1). 其中 n 即去掉 SCC 后剩下的点数. O(n3/ω).


Remark.

  虽然和这道题没关系, 不过我们第一次看到这个问题时, 总想要明确地描述出 "存在坏狗 (蓝眼睛)" 这一条 "神谕" 究竟给狗狗 (村民) 们提供了什么信息? 这一点难道不是大家都心知肚明的吗? 虽然归纳过程无可辩驳, 但我怎么回答听众提出的这个问题?

  以下是以前我给出的一个解释, 分享一下 w.

  • n 条狗狗按 1n 编号, 人为地将坏狗排在前 k 个 (狗狗们并不知道这一点).
  • 询问 1 号狗狗, "你是否知道有坏狗?", 问题记为 Q1.
  • 询问 2 号狗狗, "你是否知道 (1 号狗狗知道 Q1 为真)?", 问题记为 Q2.
  • 询问 i 号狗狗, "你是否知道 (i1 号狗狗知道 Qi1 为真)?", 问题记为 Qi.

  在获得神谕之前, Q1,,Qk1 的回答都为真, 因为这些狗狗可以 (也只能) 通过观察身后狗狗坏不坏来得出结果. Qk 却为假: 身后全是好狗, k 号狗狗没办法回答这个问题!

  神谕降临之时, k 号狗狗在第 k 天知道了 Qk 为真: "只能我是坏狗了"! 这就是神谕带来的信息: Qk 一定为真.

  所有坏狗都可以是 k 号狗狗, 呜呼.

  One more step, 这个套娃逻辑很让人有把它拓展到超限序数上的冲动. 不过我暂时没想到什么合理的问题设定.

10.「HDU #5628」Clarke and math

  欲求 g=fIk, 预处理 I2t 后类似快速幂一样卷 log 次即可. 复杂度 O(Tnlognlogk). 当然, 考察 Ik 的 Bell 级数, 可以直接线性筛出来, 所以也能做到 O(Tnlogn).

11.「LR #11」「LOJ #572」Misaka Network 与求和

ans=i=1nj=1nf(gcd(i,j))k=d=1nf(d)ki=1n/dj=1n/d[ij]=d=1nf(d)kS(n/d),

其中 S2φϵ 的前缀和. 我们现在就只需要求出 f(x)kO(n) 个前缀和.

  这种不是积性函数但和素因子贡献强相关的函数很可能可以用 Min_25 筛求解. 令 F(m)=i=1mf(i)k, F(m,i)=jm,jPlpf(j)pif(j)k, 考虑 Min_25 过程中加入的最小素因子是否参与贡献次大素因子, 得到转移:

F(m,i)=F(m,i+1)+j1,pij+1m(F(m/pij,i+1)+pik(π(m/pij)i+1)).

  最终 F(m)=F(m,1)+π(m), 到此就可以筛出需要的东西了. 复杂度 O(n3/4logn).

12.「CF 1824A」LuoTianyi and the Show

  枚举第一个定点观众 (或者 x=0, x=m+1), 此后左右的人的贡献都能贪心算出来. O(n).

13.「CF 1824B」LuoTianyi and the Floating Islands

  设 cs 表示切掉树上任意一条边得到的 2(n1) 种连通块中, 大小为 s 的个数. 答案显然就是

scsi=k/2+1k(si)(nski).

暴力算这玩意儿就是 B1, 注意后面的和式随着 s 增加, 变化量具有明显的组合意义, 可以直接维护, O(n).

14.「SDOI 2018」「洛谷 P4607」反回文串 ⭐

  自然的计数思路是枚举回文串, 然后计算其有多少种本质不同的循环同构, 当然还需要对本来就同构的回文串去重. 通过一些灵魂绘画可以看出来, 设回文串 S=S[:]k, 其中 为其最小周期长度, 那么一共有 k(+1)/2S (所有 "/" 除号都是下取整除, 语境挺充分的 w); S 可以对应 个同构串. 不过当 2, 交换周期前后半段仍能得到同类串, 所以此时贡献应当为 /2.

  接下来就是容斥啦! 这个容斥关系不太明显, 我们直接设出 的容斥系数 f(), 仅在 S 的种类上讨论:

df(d)=k(+1)/2f()=dμ(/d)k(d+1)/2.

  先不讨论 2 的特殊贡献, 就认为它们的贡献系数也是 , 那么

ans=dndtdμ(d/t)k(t+1)/2=tntk(t+1)/2d(n/t)dμ(d).

设后一个和式为 g(n/t), 则显然有 g=(idμ)I, 其 Bell 级数为 Gp(z)=1pz1z, 提取系数非常方便, 我们枚举 n 的因子 t, 就能算出 ans.

  接下来考虑 2, 即 2(dt) 的情况, 此时我们需要让贡献 /2. 讨论 t 的奇偶性, 若其为偶数, 在最后贡献答案时 /2, 后面 g 的值照常算; 若 t 为奇数, 将 G2(z) 修正为 G2(z)=1(2÷2)z1z=1 即可. 实现时需要 Pollard-Rho, 复杂度 O(T(n1/4+d(n)logn)), logn 可以卡到 logp. 如果你足够变态也可以平衡到 O(T(n1/4+p+d(n))).

15.「SDOI 2018」「洛谷 P4619」旧试题 ⭐

ans=i=1Aj=1Bk=1Cσ0(ijk)=i=1Aj=1Bk=1Cxiyjzk[xy][yz][zx]=x=1Ay=1Bz=1C[xy][yz][zx](A/x)(B/y)(C/z)=u=1Av=1Bw=1Cμ(u)μ(v)μ(w)x=1A/uy=1B/vz=1C/wAlcm(u,v)xBlcm(v,w)yClcm(w,u)z.

  那你就要问了, 这推了半天, 把三个求和变成六个求和, 有什么作用吗?

  首先, 当 (u,v,w) 确定时, 后面的和式是三个同样形式的求和的乘积, 可以预处理出来. 而对于 (u,v,w), 需要满足形如 μ(u)0, lcm(u,v)A 的限制, 可能的 (u,v) 匹配就仅有 m<9×105 条, 我们直接在这个匹配图上跑三元环计数即可. 注意三元环计数枚举的是 {u,v,w} 可重集, 在计算贡献时还需要讨论它们作为有序组的顺序关系. 复杂度 O(nn+Tmm), 不知道我为什么写得很慢.

posted @   Rainybunny  阅读(194)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
历史上的今天:
2021-05-09 Solution -「多校联训」平凡
点击右上角即可分享
微信分享提示