Loading [MathJax]/jax/output/CommonHTML/fonts/TeX/Math-BoldItalic.js
Live2D

Diary & Solution Set - 多校度假

目录

Defining LATEX macrosDefining LATEX macros

Summary6.14Summary6.14

ContestContest (3/3)(3/3)

  Contest.

  总结等会儿写,好像要走了。

  酒店超级大大大大软枕头导致没睡好,继而使 Min_25 调试 1h+1h+,比赛体验感急剧下降。(雾

  颓废好久了,今天算是第一天复健,身边坐着不认识的人貌似让我变自律了(?)

  先开的 T2,这个 μ(p)=fk(p)μ(p)=fk(p) 的性质太 Powerful Number 了于是开冲,冲到准备写 Powerful Number 发现好像跑不过,而且 Powerful Number 好久没写估计得调很久,所以先放了,看 T1。发现数据范围是 w=w= 很大很大和 w=w= 很小很小,是针对数据编程?ww 很大比较随便,ww 很小好像不好做啊……

  上了几次厕所,想到了 ww 小的一个合理解释:对于同一个数,它能贡献的询问区间只有近 O(n)O(n) 种。各种艰难地解释后得到了正解做法。封在 SmallMnamespace 里写出来一看——好像复杂度和 ww 没啥关系昂。😅

  中途浅想了想 T3,发现一个思维难点是:我的贪心(或者其他)解法是能够构造字典序最小方案的,那么常规树上贪心就很很困难……网络流?这个 n106n106……虽说从“题能做”的角度思考问题有时候确实方便,当还是不能忘了思考基础结论啊!然后这题就寄了,最后得到了送温暖的 10pt10pt

  接着写 T2,想着反正复杂度不尽合理不如冲一发 Min_25。Min_25 是啥来着……草稿纸上重新发明了算法(?)调了大半天(宏展开导致运算顺序反逻辑,Min_25 第一阶段还去枚举 pipi 的指数……)大概 12:0512:05,样例过了。科学地卡一下常,本地 2.1s2.1s 极限数据,觉得比较稳,交了。

  最后检查了一下 T1 主席树的空间,最后还是 RE 了,痛失 rk1(虽然给一次修改机会估计大家都是 rk1,没啥好说)。😢

A.A. 区间第 kk

  给定 n,mn,m 和序列 {an}{an}qq 次询问,每次给出 l,r,kl,r,k,求将 a[l:r]a[l:r] 中所有出现次数多于 mm 次的数替换为 nn 后,a[l:r]a[l:r] 中第 kk 大的值。强制在线。

  0ai<n,q1050ai<n,q105


  Tags:「A.扫描线」「A.数据结构-树套树」

  原题指明了形如 m=5×103m=5×103m=10m=10 之类的限制,通过迷惑选手增加题目难度属于是。

  先忽略在线,考虑扫描线,从左到右扫描元素,设当前扫描到 ppap=xap=x,其最近若干次出现位置为 i0,i1,i2,,im,im+1=pi0,i1,i2,,im,im+1=p,那么当左端点 l(i1,im+1]l(i1,im+1] 时,xx 的出现次数会在原来的基础上 +1+1;当 l(i0,i1]l(i0,i1] 时,本来 xx[l,r][l,r] 的出现次数为 mm,但是 pp 让其出现次数超过 mm,所以将 l(i0,i1]l(i0,i1]xx 的出现次数置为 00(即 mm)。可以用权值线段树维护这一过程。

  强制在线?主席树套主席树即可,毕竟 1G1G 随便用。复杂度 O(nlog2n)O(nlog2n)

B.B. 求和

  定义积性函数 fk(pc)=(1)c[ck]fk(pc)=(1)c[ck],求

ni=1nj=1mk=1fk(gcd(i,j))mod230.ni=1nj=1mk=1fk(gcd(i,j))mod230.

  n1010n1010m40m40


  Tags: 「A.数学-数论」「A.数学-Min_25 筛」「A.数学-Powerful Number 筛法」

  基础化简:

ans=mk=1nd=1fk(d)n/di=1n/dj=1[ij]=mk=1nd=1fk(d)(2n/di=1φ(i)1).ans=mk=1nd=1fk(d)n/di=1n/dj=1[ij]=mk=1nd=1fk(d)2n/di=1φ(i)1.

后面反手杜教筛,现在式子长成

ans=mk=1nd=1fk(d)g(n/d).ans=mk=1nd=1fk(d)g(n/d).

你大可以直接莽 Min_25,O(mn3/4logn)O(mn3/4logn) 能过。

  (嘴巴:)发现 fk(p)=μ(d)fk(p)=μ(d),这个时候就很激动地想到 Powerful Number。考虑一下 Powerful Number 搜索过程中对函数值的维护,可以用一个 bit 表示某个 ff 的点值,popcount 一下也能快速求出 kfk(x)kfk(x)。然后类似于杜教筛的优化方法,线性筛(貌似需要再容斥一下)求出 ffn2/3n2/3 个点值,后续的前缀和再用 Powerful Number 算。可以得到 O(n2/3)O(n2/3) 的算法。(更具体地,可以说是 O(n2/3mω)O(n2/3mω),但 mm 小得可怜 w。)

C.C. 树 *

  给定一棵含有 nn 个结点的树,点 uu 有点权 auau,初始为 00。每次操作指定路径 P(u,v)P(u,v),对于 e=x,yP(u,v)e=x,yP(u,v),若 x<yx<y,令 axax+1,ayay+1axax+1,ayay+1;否则令 axax1,ayay1axax1,ayay1。给出最终的点权,构造操作方案。先最小化操作次数 mm,再最小化 (u,v)(u,v) 序列的字典序。

  n106n106,保证 mnmn


  Tags: 「B.贪心」「C.性质/结论」

  被诈骗了 /jk

  注意操作的可合并性,若点 uu 是某个操作的起点,则其一定不是另一个操作的终点,反之亦然。此外,通过考虑每条边被经过的次数,可以发现用每个点作起点(+1+1)/终点(11)的次数集合可以唯一描述操作的效果。我们只需要求出这一集合,然后贪心构造字典序最小的操作即可。

  如何求呢?还是将子树作为贪心的子结构。令 f(u)f(u) 表示在放置最少的路径的情况下,从 uu 向上走的路径条数(若为负,则是向下走);g(u)g(u) 表示 uu 作起点的次数。设 uu 的父亲为 ww,孩子们为 vv,那么

f(u)=([u<w][w<u])(auv([v<u][u<v])f(v)),g(u)=f(u)vf(v).f(u)=([u<w][w<u])(auv([v<u][u<v])f(v)),g(u)=f(u)vf(v).

  O(n)O(n) 即完成所有工作。

+1.+1. 「CF 1654F」Minimal String Xoration

  Link & Submission.

  给定字符串 S=s0s2n1S=s0s2n1,求一个 xx,最小化 S=s0xs(2n1)xS=s0xs(2n1)x 的字典序。

  n18n18


  Tag: 「B.倍增」

  令 StStx=tx=t 时的 SS,对 {St}{St} 倍增基排即可。复杂度 O(n2n)O(n2n)

Summary6.15Summary6.15

  数学算麻了。但刷题状态比在校 zhihu.com 的状态好多啦!

TopicTopic 数学 (4/4)(4/4)

A.A. 「NOI 2014」「洛谷 P2354」随机数生成器

  水题。

B.B. 「CF 923E」Perpetual Subtraction ^

  以前的题解。对角化线性变换,经典题。

C.C. 「Gym 102978A」Ascending Matrix *

  Link & Submission.


  Tags: 「A.数学-组合计数」「B.模型转化」「C.Tricks」

  LGV-lemma 已经 114514114514 杀兔子了。(

  先不考虑 aR,C=VaR,C=V 的限制,想想怎么求总方案数,我发现非常困难。

  巧妙转化:画一张 (N+1)×(M+1)(N+1)×(M+1) 的网格图,格点左上角为 (0,0)(0,0),格点 (r,c)(r,c) 左下方的格子内填上 ar+1,c+1ar+1,c+1。那么 aa 的数量就是:从 (n,0)(n,0)(0,n)(0,n)K1K1 条仅向右或向上走的折线,使得折线互不跨越的方案数。对应到 aa,这些折线就是对 ai,j=1..Kai,j=1..K 的区域的划分。

  注意若存在跨越,必然存在相邻两条折线的跨越。我们把所有折线沿 v=[2222]T 平移,就能将跨越转化为相交,继而使用 LGV-lemma 对不交路径计数。

  再加上 aR,C=V 的限制,为了保持路径的等价地位,我们去描述路径的条数,相当于平移之前,需要恰有 V1 条路径在 (R,C) 严格上方。在 LGV-lemma 的基础上,把源汇路径写作 c0+c1x 的形式,求出所得矩阵 A[xV1]detA 即可。实现得好大概 O(k2min{n,m}+k4)

  坑点巨多,草。

D. 「Gym 103415J」Cafeteria

  Link & Submission.


  Tags: 「A.DP-动态 DP」「C.性质/结论」

  一脸 DDP 的样子,令列向量 fi 表示一段前缀的 DP 状态(内容是众所周知的),那么字符 c 对应的转移矩阵 Vc 形如

Vc=[1?1?1?1],

其中 V0 开始编号,串 B1 开始编号,当 Vi,i1=[bi=c]

  但直接 DDP 自然寄了,我们很可能需要几乎线性的做法。于是想到记录转移矩阵与其逆矩阵的前缀积。研究 Vc 的你矩阵,其形如

V1c=[1111111].

1 的位置取决于 Vc1 的位置。)可见 Vc 的左乘可以 O(m2) 模拟;V1c 的右乘虽然不太舒服,但还是可以通过按列类和的形式 O(m2) 计算。每个前缀矩阵中只有 O(m) 个位置参与了答案的计算,注意精细存储。最终复杂度 O(nm2+qm)

E. 「Gym 103415K」Magus Night *

  Link & Submission.


  Tags: 「A.数学-数论」「A.数学-数学推导」

  设 U={1,2,,m}n,令 A={SU}B={SUgcd(S)>q}C={SUgcd(S)qlcm(S)<p},则答案可以由三个集合的贡献容斥。

  对于 A,显然

SAS=(mi=1i)n.

  对于 B,注意到 m 的范围不太过分,考虑暴力枚举 gcd,那么

SBS=mi=q+1SB[gcd(S)=i]S.

优化方法比较初等。令

t(d)=(dii)n=dn(m/di=1i)n,

f(d)=SB[gcd(S)=d]S=t(d)ddd>df(d).

可以 O(mlogm) 求解。

  对于 C,同时枚举 gcdlcm,可以得到式子

SCS=qi=1ijj<pS[gcd(S)=ilcm(S)=j]S.

前两层和式还是可以 O(mlogm) 枚举,重点考察

g(i,j)=S[gcd(S)=ilcm(S)=j]S

的计算。先做简单简化,

g(i,j)=ing(1,j/i),

所以我只需要求 g(1,x) 的值。注意到一个有趣的事实:qm,而 silcm(S),所以当 lcm(S) 合法时,序列 S 一定合法。结合 lcm 的性质,自然想到拆开素因子贡献。而根据上述事实,素因子的贡献互不影响,可以直接将素因子贡献乘起来得到答案。因此

g(1,x)=p[(αp(x)i=0pi)n(αp(x)i=1pi)n(αp(x)1i=0pi)n+(αp(x)1i=1pi)n].

可以 O(mloglogmlogn) 求解(官方题解的复杂度应该有误)。注意到 piO(m) 级别的,通过线性筛预处理自然数幂可以做到 O(mloglogm),则总复杂度为 O(mlogm)

Topic 多项式 (5/7)

A. 「CF 286E」Ladies' Shop ^

  众所周知,^ 表示做过的题(“跳”,很形象.jpg)。

B. 「CF 960G」Bandit Blues

  水题。和建筑师一样的。建筑师的题解

  然后我为了图省事儿一个「斯特林数-列」+ 暴力枚举最大值位置莽上去,因为模数忘记改调了半天。😰

C. 「CF 986D」Perfect Encoding

  水,但高精只能用 Pascal 卡过(在省事的前提下)。

D. 「CF 623E」Transforming Sequence ^

  远古题解。DP 选择本身比较无序,所以可以倍增。但是 MTT。

E. 「AGC 021F」Trinity *

  Link & Submission.


  Tag: 「A.DP-计数 DP」「A.数学-多项式」

  首先,我不是写的 Tiw 的做法。

  行上状态比较简单,以此划分子问题。令 f(i,j) 表示考虑了前 i 列,使用了 j 行(相对顺序确定而标号未定)的方案数。讨论第 i+1 行的列 min/max 的情况:

  • 没有新加,列上空或全部来自于已有的 j 行:f(i+1,j)+((j+12)+1)f(i,j)
  • 两个都来自 j,新加 k 行:f(i+1,j+k)+(j+kk+2)f(i,j)
  • 有一个来自于 j 另一个来自于新选的 k 行中的一行:f(i+1,j+k)+2(j+kk+1)f(i,j)
  • 两个都来自新选的 k 行中的一行:f(i+1,j+k)+(j+kk)f(i,j)

  总而言之:

f(i,j)=((j+12)+1)f(i1,j)+jk=1(j+2k+2)f(i1,jk).

卷积优化一下。复杂度 O(mnlogn)

Summary6.16

  今天 arc 是不是有活动啊。

Contest (3/3)

  Contest.

  对于题目质量只能不予置评,被错大样例整死了。

  怎么大家都没有质疑精神呢?

A. 小学生物理题

  有 n+1 条导线串联了节点 0,1,,n+1,其中 0 在负无穷远处,n+1 在正无穷远处,其余点用坐标描述。现在有恰一条导线断路,站在一个节点上,检查该节点是否与 0 联通的代价为 di,在节点间行走的代价为走过的距离,修复第 i 条导线的代价为 fi。求从 1 出发,最坏情况下修复好导线的最小代价。

  n3×103


  Tag: 「A.DP-单调队列优化」

  发现肯定不会检查 0n+1,所以可以把 0 挪到 1 的位置,n+1 挪到 n 的位置,初始时从 0 出发,这样就没有“无穷远”的特殊性了。先想暴力,令 f(l,r,0/1) 表示已知断路位置在节点 l,r 之间,现在站在 l/r 时,……的最小代价。那么

f(l,r,0)=sl+minp(l,r){sp+dp+max{f(l,p,1),f(p,r,0)}},f(l,r,1)=sl+minp(l,r){sp+dp+max{f(l,r,1),f(p,r,0)}}.

注意到若 [l,r][L,R],则 f(l,r,t)f(L,R,t)。于是当固定 lrmax 取的项关于 rl 具有单调性。指针维护 max 取值分界点,单调队列维护可选值的最小值即可。复杂度 O(n2)

  被卡常了,懒得卡 qwq。

B. 数轴变换 *

  维护一根数轴。初始时 0 为黑色,其余整点为白色。进行 q 次操作:

  1. 单点染黑。
  2. 将所有黑点附近距离不超过 x 的整点染黑。
  3. 反转区间 [l,r]
  4. 回退到历史状态。
  5. 单点查询。

  q2×105,坐标不会爆 long long


  Tag: 「A.数据结构-可持久化平衡数」

  由 2 操作启发,注意到一个点被染黑多次并不影响答案,尝试维护差分序列。由于 +11 在 2 中的移动方向不同,所以得用分开维护它们。现在 1,2,5 理论上好做了,4 加个持久化问题不大。问题在于 3,据说是一个 trick:在左右加无实际效果的 +11 使得 [l,r] 内的差分标记构成匹配括号串,然后将括号串翻转(不是单纯 reverse,是真的“翻”)。总之 O(qlogq) 能做。

C. 中学生物理题 *

  给定平面上 n 块跨 1×1 网格对角线摆放的平面镜坐标,求给镜子四染色的方案,使得任何可能的垂直水平光路形成的环中,经过每种颜色的镜子次数相同且均为偶数。(被镜子两面各反射一次,算经过两次。)

  n5×105


  Tags:「A.构造」「A.图论-欧拉路」「B.模型转化」「C.性质/结论」

  可见,对一面镜子的真正限制并不是环的内部,而是镜子两面所涉及的两环之间的协调。

  如果只二染色?一种视角是利用欧拉回路“每条边恰好经过一次”的条件。需要认清的是,所谓的“点”“边”其实是具体题目中对象的抽象体现。对于本题,令环为“点”,镜子为“边”,一个环总会一进一出,是否可以将欧拉路黑白染色,使得环上黑白总相等?

  正确的。特别地,为无穷远处间一个虚点,包含在环内的镜子提供一条自环,我们可以直接欧拉回路。

  四染色?先二染色再二染色!在二染色的基础上,去黑白边的生成子图再二染色一次。除虚点外的结点度数为 8 的倍数是必要条件,而在这一条件成立的前提下,可以验证欧拉路总存在。复杂度 O(n) 解决。

Summary6.17

Summary6.18

Summary6.19

Summary6.20

  前几天因为以学考为主的破事儿耽搁了,也许会补上。(咕

Contest (3/3)

  Contest.

  问题是,最后 40 min 才发现 A 是签到真的合理吗?

A. 益智游戏

  把 n×n 的网格图中所有 n2 个格子各自划分为 2×2 的小网格,并在其中放上一块骨牌。给出初始骨牌放置方案,改变 (i,j) 上骨牌方向的代价为 ai,j,求最少的代价,使得不存在一个 2×2 的小网格的对角线都被骨牌覆盖。

  n2×103


  Tags:「A.DP-杂项」「C.性质/结论」

  (上面的题意写得像狗屁,但我懒死了。)

  手玩一下结论,发现左置骨牌的左侧一定是左置骨牌,其余方向结论类似。然后发现:

gnp.png

  对分割点的上下左右四部分分别 DP 求最优方案即可。复杂度 O(n2)

B. 华为 *

  给定 n,m,pT 此询问 (xi,yi),初始时 x=y=0,每次操作以 p 的概率令 x(x+1)modn,否则令 y(y+1)modm,求 x=xiy=yi 时的期望操作次数。答案模 998244353

  n109m,T400


  Tags: 「A.多项式」「B.向量/矩阵优化」

  O((n+m)3) 的就不说了。注意到 n 的量级与 m 不同,令 f(i,j) 表示 x=i,y=j 出发逆向操作到 x=y=0 的期望操作次数,尝试强行拆开 m 方向上(行上)的转移环,观察列上 f(i,) 整体的变化。令 q=1p 为操作施加到 y 的概率。因为

f(x,y)=pf(x1,y)+qf(x,y1)+1,

去消除 f(x,y1) 这项,直接枚举 (x,y) 最终从哪个 y 走到 (x1,y),那么

f(x,y)=11q+m1i=0f(x1,yi)pqi1qm.

Fx(z)=m1i=0f(x,i)zi,那么

Fx(z)=1zm(1q)(1z)+Fx1(z)×p(1zqm)(1qm)(1zq),

其中 × 是模 zm 意义下的循环卷积。注意到这是对 F 的线性变换,立马想到矩阵加速。令

V=[p(1zqm)(1qm)(1zq)1zm(1q)(1z)01],

f(x,y)=[zy](Vx[F0(z)1]T)(1)

  问题是,我们并不知道 F0(z)。结合暴力做法,直接拿出 Fn1(z) 表示 F0(z),解一解方程即可。复杂度 O(m3+Tmlogmlogn)

C. 区间距离 *

  给定 a1..n,b1..nq 次询问,每次给出 p1,p2,l,求出

l1i=0|ap1+ibp2+i|.

  n105q1061ai,biV=5


  Tag: 「A.分块」

  暴力循环可以过十万方,并且我发现三目有时比一维 int 数组寻址快。

  分块,就每 ω 一块,因为询问涉及到对 a 的位移,所以块小一点可以以更小的损失对齐整块。预处理每个小位移 r[0,ω),整块位移 R[n/ω,n/ω] 的情况下,a 的前 k 个块与 b 的前 k 个块对应的答案。把 |xy| 拆成 c[[xc][yc]] 数一数 bit 即可。复杂度 O(Vn2/ω+qω)

Summary6.21

Contest (3/3)

  Contest.

  从头暴力到尾,比较稳健就是了。

  个人感觉 T2 T3 部分分不大合理,像我这种纯暴力选手得分太多了。(

  T1 比较尴尬,写了个根号(而且可能是伪的)算法然后开始卡 log,没想到正解是 polylog 的。掉坑里走不出来了。

A. 给国的道路 *

  给定无向图 G,结点 u 有点权 auEG 初始为 ,但是提供了可选的边集 E={(u,v,s)}。当 Gu,v 不连通且 u,v 连通块点权和 s 时,(u,v,s) 可加入 EG。求最长的、再字典序最小的边加入方案。

  n105m2×105ai,s106


  Tags: 「A.并查集」「B.Tricks」

  设边 (u,v,s) 当前还需要 r 的点权和才能加入 G,在每个连通块上用堆维护二元组 (r/2,(u,v,s))。注意我们对 r 的更新是惰性的:拿出最小的 (r/2,(u,v,s)),若 r/20,重新算一遍得到一个 r,根据 r 再来决策是否加入边。每条边最多被误判(拿出来又放回去)O(logV) 次。Splay 实现启发式合并可以做到 O(n(logn+logV))

  (然后发现 pb_dstree<..., splay_tree_tag, ...> 跑出来还没 std::set 快。)

B. 给国与时光机 *

  考虑数轴上的整点 0..2n+1,其中 1..2nn 个传送门两两配对。 入一个点时,必须 传送 到另一个点。从 0 出发走到 2n+1,已知 {(ai1,ai)}mi=1 是所有被走过的线段,构造配对方案或声明无解。

  n105


  Tag: 「A.构造」

  把 0..2n 分为 A,N,L,R 四个集合,分别表示 x 两边都走过/都没走过/只走过左/只走过右。显然传送门只能在 A2,N2,L×R 里选。N2 随意就好,如果 2|N| 则不合法。结合 m=2n+1 的暴力,可知 2|A| 不合法;4|A|A 可以四个一组交错配完,L,R 相邻配;否则 |A|=4k+2,留两个 LR 配对,把夹着 LR 的一对 AA 配对即可。复杂度 O(n)

C. 给国与赌场 *

  卢老爷拿着 ab<1 块钱准备赢到不少于 1 块钱。每次他可以投注任意正实数金额 r(0,ab],但必须不小于上次投注金额,此后以 p 的概率得到 2r 块钱,否则血本无归。求最优策略下达到目标的概率。

  b106p<12


  Tags: 「C.思维」「C.性质/结论」

  一个比较好猜也比较好证的结论:每次投注现有本钱 x 的二进制小数表示下的最低 bit。这是因为若投注的不是最低 bit,则无论赢钱与否,最低 bit 都没法再使用,也没法对 1 产生任何贡献。

  那么当 a/b 是有限小数时就可以直接模拟了,否则,对于完全不会数学的兔来说还是非常困难。

  然后我被神谕了结论:我们还有一种贪心策略:若 x<12,all in;否则投注 1x。注意到上一个结论的证明其实可以说明要不要求投注递增这一要求,我们的策略都是优的,所以这里直接忽略。

  设在这种策略下,f(x) 表示本金 x 的获胜概率,则

f(x)={p+(1p)f(2x1),x12pf(2x),x<12.

​  可以证明这种策略与 lowbit 策略等价。如图:

proof.png

单次迭代可以把大三角形拍成两个小三角形(注意点的开闭),足够的迭代后每个位置的取值都是自己的 lowbit。

  拿着 f(x) 做就比较好办了。设 f(a/b)=z,迭代 f(/b)=kz+b,得到一个 ρ 形迭代过程,通过环或者 a=0 的位置把 z 解出来即可。复杂度 O(b)

Summary6.22

  【洛天依AI】贝加尔湖畔【你清澈又神秘】_哔哩哔哩_bilibili

  都给我去听!!!!!!!!!

Class 思维向杂题 (9/9)

  注:本节的星号 * 标记可能有歧义,毕竟怎么都浅听过一遍讨论的。因此将其弃用。

A. 「CF 1458C」Latin Square

  Link & Submission.


  Tag: 「B.Tricks」

  Trick: 注意到对 p 求逆相当于 (i,pi)(pi,i),那么把 pi 也当作一维坐标。

  所以需要维护三维坐标集合 {(x,y,z)},支持一个坐标整体位移、两维坐标整体交换。拿常数个标记就能 O(1) 维护。所以复杂度为 O(n2+m)

B. 「ICPC EC-Final 2020」「Gym 103069C」Random Shuffle

  Link & Submission.


  Tag: 「A.Gauss 消元」「C.性质/结论」

  这个 xor-shift 发生器生成的数的每个 bit 必然是种子的 64 个 bit 的一个线性组合。通过反向还原 a 可以得到第 i 次生成的数 xii 所得余数 ri,即 xi=ri+ki (kN)。于是,我们可以借此确定 xi 低于 i 的 lowbit 的 bit 与 ri 的对应 bit 相等,继而构造关于 x 的 bit 的线性方程组。最贫困的 n=50 时,我们会得到 47 个方程,除去线性相关的东西大概有不超过 20 个自由元,暴力枚举它们的取值 check 一下即可。

  设方程有 c 个自由元,ω=64 为 bit 数,复杂度最坏为 O(2c(ω+n))。需要位运算稍精细实现。

C. 「THUPC 2021」「洛谷 P7606」混乱邪恶

  Link & Submission.


  Tags: 「A.DP-数据结构优化 DP」「B.std::bitset」

  背包是一个 n×n×n×m×m 的 TF 状态,std::bitset 扬掉最后一维,经典随机化根号 trick 扬掉两个 n,选一选阈值,O(n2m2ω),当然至少有个枚举方向的 6 的常数。

D. 「JOISC 2022」「UOJ #731」制作团子 3

  Link & Submission.


  Tags: 「A.构造」「C.非传统-交互题」(为了不污染 tag,带「构造」的默认带「思维」。)

  如何判断一个集合 S 是否存在重复的团子?——询问 US,若回答 a=m1,则表明 S 无重复团子。

  进一步,思考 a 的意义:其表示 S 内出现最多的团子数量。

  猜测 5×104=5nm=logmnm,二分?利用鸽巢原理,可以简单得到一个基于增量法的构造:令 m 个集合 S1..mm 串团子,尝试将当前团子 x 放入其中一个使其仍合法。每次取可能集合的一半 T,得到 {x}{ST} 中出现最多的团子数量 a。若 a|T|,则 T 中存在一个可加入 x 的集合;否则 ST 中存在,递归询问就好。操作次数为 O(nmlogm)

E. 「集训队互测 2022」Were You Last @

  @ 是嘴巴,表示口糊,因为 OJ 上莫得。

  交互题。实现函数 bool WereYouLast(int n, int m),其返回状态能且仅能依赖于 n,m 以及交互库提供的 m 个 bit 长的寄存器。且每次调用时,仅能对其中不超过 6 个 bit 进行读和(或)写。要求其恰好在第 n 次调用时返回 true

  m=105n=2k226kN


  Tags: 「A.构造」「C.非传统-交互题」

  我确实编不出 motivation 了,总之我们用 5+26 个 bit 构成了一个 pointer 和一个 pool。pointer 指向 pool 的一个位置 p。则函数行为如下:

  1. 读出 p
    • p=logn,返回 true
  2. 读出 p 指向 bit 的值 x
    • x=0,令 p0
    • 否则 x=1,令 pp+1
  3. x¬x
  4. 返回 false

不难证明,p 第一次取到 p0 时,是第 2p0 次调用。这真的“很经典”吗……

F. 「CF 1500D」Tiles for Bathroom

  Link & Submission.


  Tag: 「A.DP-杂项」

  对于 k,显然可以差分。我们只需要对于 (i,j),求出以其为右下角的最大合法方阵即可。进一步,可以转化为求 q 远切比雪夫距离。直接在每个位置维护一个前 q 近集合,在 (i,j) 合并 (i1,j1),(i1,j),(i,j1) 的集合并贡献答案。暴躁实现的复杂度是 O(n2qlogq)

G. 「LOCAL ?」LCM @

  给定序列 A={ai}ni=1,求字典序最小的 B={bi}ni=1,使得 i, biailcmA=lcmB

  n104ai1018


  显然的贪心:对于每个 lcmA 中的 pk,把它放在最后一个 A 中的出现位置。

  素因数分解?这数据范围连 Pollard-Rho 都不放过。考虑从后往前增量法构造 B。对于当前的 i,令 tai,枚举 j>i 并令 tt/gcd(t,bi),继而得到 ai 中取到目前 lcm 的素因子集合。把这些素因子幂的乘积作为 bi,再将 j>ibj 除掉 gcd(bi,bj),因为 bj 这一部分素因子的指数不足以贡献 lcm,自然是扔掉更优啦。这是一个 O(n2logV) 的算法,还是过不了。

  接下来是优化。对于求 t 的过程,类似 Pollard-Rho,先累积所有 bi 再取 gcd。令 s=j>ibjmodai,那么 s 的素因子集是 t 的超集(但是它们的幂不一定不小于 t 中的幂)。则不断迭代令 ttgcd(s,ai),aiai/gcd(s,ai) 就能得到 t。这里也许可以优化到单 log

  对于 bj 除因子的过程,注意到 B 是互素的,那么顶多有 logbi 个不同的位置会因除法变化;而一个数最多被除 log 次。二分之类的快速找出这些位置除掉 gcd。最终可以做到 O(n2+nlognlogV)。可能有个 O(nlog2V)

  嘴巴真舒服。

H. 「洛谷 P6383」Resurrection

  Link & Submission.


  Tags: 「A.DP-树上 DP」「C.性质/结论」

  所以我觉得讨论题真的可能糟蹋了好题。耳朵顺走一个结论啥事没有。

  先来研究 G 合法的条件。有以下几个必要条件是容易发现的:

  • G 是树。
  • n 为根,G 中结点 u 的父亲是 T 中结点 u 的父亲。
  • G 中的父子连边在 T 上对应的路径,若路径共线,则不会交而不含。

  喜闻乐见,这些条件和起来就充分了。

证明

  归纳。n=1 时成立。设结点数 n<k 时皆有充分性。尝试证明 n=k 时的充分性。

  只需要以恰当的方式砍掉一条边就能归纳了。取 nG 中的邻接点中,在 T 中最深的结点 u。在 T 上切 (u,fa(u))G 上切 (u,n)。显然,G 的两个连通块分别对应了 T 的两个连通块的方案。于是结论成立。  

  对这个结论计数:令 f(u,i) 表示 u 选完自己的父亲后,留下了 i 个严格祖先让孩子们可以选时,u 子树内的方案数。那么

f(u,i)=vson(u)ji+1f(v,j).

随便优化一下做到 O(n2)

I. 「CF 1586F」Defender of Childhood Dreams ^

  

Summary6.23

Contest (3/3)

  Contest.

  T1 切得比较迅速,顺便醒了瞌睡。T2 想起那啥 gcd 矩阵,尝试构造上三角化之类的矩阵构造得脑袋消失。T3 冲了暴力,知道是 DDP 但根本没细想。问题主要是“尝试构造”的过程效率真的低。

A.

  给定一棵含 n 个结点的带权树和 m 个关键点 a1..m,选定一个点集 b1..k,最小化

kC+mi=1kminj=1{dist(ai,bj)}.

  n3×103


  Tag: 「A.DP-树上 DP」

  最小化最小 = 最小化任意。每个 b 可以随意钦定覆盖点,但需要支付覆盖的连通块个数个 C 的代价。可以证明不会影响最有解的值。于是,令 f(u,v) 表示钦定 uv(任何一个点)覆盖时,u 子树内的距离与支付的 C 之和。那么

f(u,v)=wson(u)min{f(w,v),C+mint{f(w,t)}}.

O(n2) 很简洁地解决掉。

B. 摆 *

  给定 n,c,构造矩阵 A={aij},其中

aij={1,i=j0,ijijc,otherwise.

detAmod998244353

  n1011TL=6s


  Tags: 「A.数学-数学推导」「A.数学-线性代数」「B.Tricks」「C.性质/结论」

  注意到 A 的主对角线的下方全部是 c。通过相邻行作差,可以使其成为上海森堡矩阵。每行除一个 c1,令 v=cc1,那么现在 A 长成

A=[1v1v1v1].

(右上部分有值,左下部分全 0。)注意上海森堡矩阵 det 的特殊性,对于其定义式所枚举的 σ 中,每个置换环必然取一堆 v,最后取一个主对角线及以上的位置。设前 ii 列的主子式为 fi,那么

fi=fi1+vjijifjfj1.

g=Δf,那么

gi=vjijigj.

  我们只需要求 fn,即 g 的前缀和。没见过的 trick:这玩意儿可以魔改杜教筛实现的。观察杜教筛的作用式

ni=1t(i)=h(1)S(n)ni=2h(i)S(n/i).

理论上,t,h 好求前缀和就行,这并不完全依赖与 g 的积性。对于本题,构造 t(n)=[n=1]v[n1] 类似物,就能筛了。

  但 O(n2/3) 依赖于预处理的线性。注意到 g(n) 只与 {αp(n)} 有关,精细地减少对 {αp(n)} 相同的 n 的点值计算就能极大地优化速度。复杂度大概就是 O(n2/3)

C. 润 *@

  给定函数

f(n)={0,n=01,n=1log2n+12log2n+f(n2)+f(n2),otherwise.

维护 01 序列 a1..n,令 v(l,r)=ri=l2ilai,进行 q 此操作:

  1. i[l,r], ai1ai.
  2. i[l,r], ai0;
  3. i[l,r], ai1;
  4. 求出 f(v(l,r))

  n,q105


  Tag: 「A.DP-动态 DP」

  可以看出是 DDP。注意这个贡献的转移形式形如 k2k1(k+1)2k,令 s=2k1a=k2k1,就有 s=2sa=2(a+s),构造出了合理的线性变换。

  因此,令 [zosa]T 为状态向量。表示考虑了一段前缀,有 z 种递归末尾进位,o 中不进位,s,a 意义如上。分别构造 01 的转移阵即可。

  不过,对于 v(l,r)=2klog 的取整情况会有偏差。所以需要找到后缀 0001 的位置,特殊地转移一下。复杂度 O(qlogn)43

Summary6.24

Contest

  Contest.

  你感受一下题目名,你说我怎么补。

A. tmcpq !

B. rsrams !

C. hpmo !

+. 补题/补题解

  • 「AGC 021F」Trinity
  • 「LOCAL 20220616」中学生物理题

Summary6.25

Class Mathematic Olympics

A. 「NOIOL-S 2021」愤怒的小 N

  Link & Submission.


  Tags: 「A.数学-生成函数」「A.数学-数学推导」「B.Tricks」

  一个 trick:

ak=k![xk]eax.

进一步:

uSuk=[xk]uSeux.

  我们令 At(x),Bt(x) 分别为前 2t 个位置中,a,b 位置上这个 EGF 的和。那么

A0(x)=1,B0(x)=0;At(x)=At1(x)+e2t1xBt1(x),Bt(x)=Bt1(x)+e2t1xAt1(x).

Pt(x)=At(x)+Bt(x)Qt(x)=At(x)Bt(x),这样两个多项式就可以独立递推。那么

Pt(x)=2t1i=0eix=1e2tx1ex,Qt(x)=Qt1(x)e2t1xQt1(x)=t1i=0(1e2ix).

  注意到 [x0](1e2tx)=0,则 k 个以上此类多项式的卷积 [xk]=0。因此 Qt(x)0(modxk) (tk)。传统艺能,拿 Qtn=(nl1n0)2 的 bit,得到

Q(x)=l1i=0[ni=1](1)count((n(nin0)2)e(n(nin0)2)xQi(x).

事实上指标 i 的有效范围只到 k,直接 O(k3) 算出来。另一方面 P(x) 就是个自然数幂和,暴力一个多项式除法就行。最终复杂度是 O(logn+k3),不排除写出 O(logn+k2logk) 的无聊人类。(

C. 「BZOJ #4126」国王奇遇记加强版之再加强版

  Link & Submission.


  Tags: 「A.数学-生成函数」「A.数学-数学推导」「A.数学-Langrange 插值」

  im?喜闻乐见,用 m![xm]eixm 放到指数外。浅推:

ans=ni=1immi=m![xm]ni=1eixmi=m![xm]1mn+1e(n+1)x1mex.

其中分母是常多项式,可以分析到答案是关于 n+1 的多项式。令 F(x)=(1mex)1,则

ans=m!fmm!mn+1mi=0(n+1)ii!fmi.

可见,若令

P(x)=mi=0xifmii!,

ans=m!P(0)m!mn+1P(n+1).

  但是……我们对 P,甚至对 f 一无所知。怎么办?其实 n 较小的时候,我们可以用答案最初的式子算出来,继而得到若干 P(t)P(0) 的值的线性关系。再者,P(x)m 次多项式,其 m+1 阶差分为 0。所以

Δm+1P(0)=m+1i=0(1)m+1i(m+1i)P(i).

利用已知线性关系解出 P(0),得到点值,Lagrange 差值。线性筛自然数幂、线性求一堆逆元,比较无聊地精细实现可以做到 O(m)

  PS: 记得判 m=1,不然 F(x) 直接戳到分式域里都不知道这么挂的。(

D. 「LOJ #6718」九个太阳「弱」化版

  Link.


  一句话题解,求

(1+x)nmod(xK1)

的常数项。可以先用组合意义自行理解。


  关于这垃圾模数:

  「Karatsuba 算法」 设要计算 2n1 次多项式 F(x)G(x) 的卷积,令 F(x)=F0(x)+xnF1(x)G(x)=G0(x)+xnG1(x),则

F(x)G(x)=(F0(x)+xnF1(x))(G0(x)+xnG1(x))=F0(x)G0(x)+xn((F0(x)+F1(x))(G0(x)+G1(x))F0(x)G0(x)F1(x)G1(x))    +x2nF1(x)G1(x).

需要三次卷积,每次卷积递归计算。复杂度 T(n)=3T(n/2)+O(n)=O(nlog23)。结束了,不依赖模数。


  没错,它也过不了,你就是得写 MTT。

Summary6.26

Summary6.27

Summary6.28

  前两天摆烂了,顺便发现这篇好像全是 solution set,根本没有 diary,正在考虑开个坑补一下。(

Contest

A. 基础概率练习题

  已知 a1..nNna1ka=m。随机在 argmax{ai} 中标记一个元素,求这个元素恰好是 a1 的概率。答案模 998244353

  n,m107


  Tag: 「A.数学-组合计数」

  抛开 a1k 的情况下,每个元素成为最大值的概率是均匀的。令 R 为目标事件,A:a1kB:i, aik,那么

Pr(R)=Pr(B)nPr(A).

组合意义不难证明。不过这个构造还是挺巧妙的。随便容斥算一算 O(n+m)

B. 基础树剖练习题

  给定一棵含有 n 个结点的树,支持 q 次操作:

  1. 给定 u,进行从 u 到根的毛毛虫形修改(具体内容不重要);
  2. 给定 u,求 u 到根的路径答案;
  3. 给定 u,求 u 子树内的答案。

  n,q105


  Tag: 「A.树链剖分」

  什么兔会把题意说的那么泛化?因为她整出了个比较泛化的做法。

  最初的手稿放下面,虽然她已经推广了更毒瘤的算法,但这个足够了。

  一些定义:

  • 毛毛虫:一条树上的链和与这条链邻接的所有结点构成的集合;
  • 虫身:毛毛虫的链部分;
  • 虫足:毛毛虫除虫身的部分。

  毛毛虫剖分,是由重链剖分推广而成的,支持 修改/查询 一只毛毛虫的信息,并且可以区分毛毛虫的身体和足分别 修改/查询 不同信息 的树上结点重标号方法。

  由于心情不好,这里直接直接给出重标号方法:

  • 首先重剖求出重链。若现在递归处理到结点 u
  • u 还未被标号,则为其标号;
  • u 是链头,遍历这条重链,将邻接这条链的结点依次标号;
  • 先递归重儿子,再递归轻儿子。

  此标号方法有如下性质:

  • 对于重链,除链头外的结点标号连续;
  • 对于任意结点,其轻儿子标号连续;
  • 对于以重链头为根的子树,与这条重链邻接的所有结点标号连续;

  所以很方便处理毛毛虫信息。并且,它也能顺便 维护重链链分的所有信息,甚至能够 维护子树的所有信息(一棵子树至多剖分为三个不交区间:重链区间、邻接轻点区间、邻接轻子树区间),复杂度与重链剖分完全一样。

C. 基础树论练习题 *@

  称一个有标号有根树合法,当且仅当其所有结点的儿子数量值都属于集合 S。现用 n 个结点生成有标号有根森林,重复这一过程 k 次,对于 i[1,n],求最终含有 nk 个结点的森林中,恰好包含 ik 棵合法树的方案数。答案对 p 取模。

  n20n<p105+3p 为素数,k1016


  Tags: 「A.数学-组合计数」「A.数学-生成函数」「B.Tricks」

  不难在 O(poly(n))(甚至指数级)的时间内求出 n 个结点构成的森林中,关于合法树数量的 OGF F(x)。现在我们需要求出 [xik]Fk(x)

  注意 p 是任意的,但是范围并不大。利用结论 Fp(x)F(xp)(modp) 可以进行递归:

Fk(x)Fk/p(xp)Fkmodp(x)(modp).

具体来说,假设我们要求 [xt],则

[xt]ABk[xpt+rt]ABpk+rk[xpt+rt](ABrk)Bpk[xpt+rt]xrtCrt(xp)Bk(xp)let ABrk=p1r=0xrCr(xp)[xpt]Crt(xp)Bk(xp)[xt]CrtB(modp)

如果预处理出 O(logpk)Cr,就能快速得到答案。也就是说得找到一个模小素数时可行的快速幂方法。可以参照 EI 的博客:整式递推的精度保留问题

  欲求 g=fk,因为我们还得 modxnk+1,神谕告诉我们若 p2>nk,我们可以直接求 gfk(modp2),其前 p2 项的结果是正确的。自己上去看证明 ✔️

  (天哪,这也太口糊了。)

posted @   Rainybunny  阅读(424)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
历史上的今天:
2020-06-14 Note -「最大团-最小度不等式」
点击右上角即可分享
微信分享提示