我的一位神兽朋友 靳

我有一位神兽朋友,后面忘了。


  • BSOJ2308 穿岩十九峰

    2024.11.2

    考虑区间 dp。

    [todo]

    怎么想出这种 dp 状态?

  • CF1221G Graph And Numbers

    2024.11.4

    简单容斥一下,发现最难处理的情况是计算独立集个数。

    • 算法 1

      搜索。每次选择当前点集中编号最小的点 \(x\),然后决策其是否加入独立集。若不加入,则删去 \(x\);否则删去 \(x\) 及其邻域。再往下递归即可。由于进行前 \(\frac n2\) 删除时只会有 \(2^{\frac n2}\) 个状态。再往后只会剩后一半的点,总共也有 \(2^{\frac n2}\) 种状态。所以其时间复杂度时 \(\mathcal{O}(2^{\frac n2})\) 的。
    • 算法 2

      我们发现当所有点度数小于 \(3\) 时是好直接计算的,我们每次删除度数最大的点即可。记 \(n\) 个点的图状态数为 \(T(n)\),那么最坏情况下有 \(T(n)=T(n-1)+T(n-4)\)。复杂度约是 \(\mathcal{O}(1.38^nn)\) 的,但实际上其远跑不满,效率远高于算法 1。
  • BSOJ2319 传说

    2024.11.5

    以起点 \(s\) 为根建出最短路树。那么每次删边只会删去 \(x\) 的父亲边。设 \(g_x\) 表示删去父边后的最短路,\(f_x\) 表示 \(x\) 为起点的答案,有转移 \(f_x=\max(g_x,\min\limits_{(x,y)\in E}f_y+w(x,y))\)。这是容易用最短路转移的。

    考虑求 \(g\)。对于点 \(u\),我们发现只会经过一条非树边,且非树边必须一个在 \(u\) 子树内,一个子树外。边 \((x,y)\) 贡献为 \(dist(u,x)+dist(y,s)+w(x,y)\),树剖维护即可。精细实现可以做到 \(\mathcal{O}(n\log n)\)

  • 「USACO 2023.12 Platinum」Cowntact Tracing

    2024.11.6

    贪心,每次取深度最深的没被删去的点 \(x\) 找到最浅的能到 \(x\) 的点 \(y\),删去 \(y\)。发现每个 \(x\) 对应的 \(y\) 是不会再删除中改变的,可以提前预处理出来。然后按深度枚举 \(x\) 删除即可。可以拿点分树维护做到 \(\mathcal{O}(n\log n)\)

  • gym14768A Easy Diameter Problem

    2024.11.8

    先把删点变加点。考虑只记录边为径心的状态,记 \(f_{d,i,j,k}\) 表示目前直径为 \(2d+1\),径心边的编号为 \(i\),下一步加点使直径增加,并且下一步加入的点属于边的 \(k\) 方向,另一方向距离为 \(d\) 的点加了 \(j\) 个。转移时径心只会移动到相邻边,枚举新径心和 \(j'\) 即可。状态数 \(\mathcal{O}(n^2)\),转移看似是 \(\mathcal{O}(n\sum deg_i^2)\) 的,但这东西远跑不满,\(n=3000\) 也只有 1.7s。

    时间复杂度我只能分析到 \(\mathcal{O}(n^{3.5})\),但我感觉能分析到更低。

  • CF1622F Quadratic Set

    2024.11.10

    考虑 \(n\) 为偶数,首先全选,那么 \(m=2^{\frac n2}(\frac n2)!(\prod\limits_{i=1}^{\frac n2}(2i-1)!)^2\)。若 \(n\bmod 4=0\),那么去掉 \(\frac n2\) 即可,否则再去掉一个 \(2\)。若 \(n\) 为奇数,我们去掉 \(n\) 转为偶数的情况。综上我们发现答案大于等于 \(n-3\)。首先若大于等于 \(n-2\) 容易拿 std::map 维护 xor hash 计算,剩下 \(n-3\) 的情况可以通过上述构造得到。

  • [北大集训 2021] 简单数据结构

    2024.11.11

    若序列是单调的,则操作是很好维护的。观察发现若将所有进行了至少一次 chkmin 操作的数提出来组成的序列是单调的,那我们每次只需维护出 1 操作时哪些数进行了 chkmin 即可,由于是区间加一次函数,可以直接上 KTT。当然也可以对于每个数找出第一次被 chkmin 的时间,拿 可持久化李超树 或 整体二分+凸包 维护即可。

  • 「IOI2018」会议

    2024.11.12

    [todo]

  • [GDKOI2023 提高组] 树

    2024.11.13

    • 算法 1

      先拆位,再长链剖分。设当前位为 \(B\),我们按深度模 \(2^{B+1}\) 分段,每段只会有一段区间有贡献,共 \(2^{B+1}\) 种区间,对于大块维护出每种的后缀和,查询时只会有两个散块,贡献也是区间的形式,再维护一个每块的后缀和即可。

      注:长链剖分时,前缀和是难以维护的,因为合并时复杂度为 \(\mathcal{O}(L-l)\)\(L\) 为长链,\(l\) 为短链。但后缀和是简单的,其合并复杂度是 \(\mathcal{O}(l)\) 的。

    • 算法 2

      万物皆可倍增!

      \(cnt_{x,i,j}\)dfs 序小于等于 \(x\) 的,深度大于等于 \(x\) 的点中,第 \(i\) 位为 \(j\) 的点的个数。再记 \(to_{x,i}\) 为 dfs 序小于等于 \(x\) 的,深度为 \(dep_{x}+2^i\) 的点中,dfs 序最大的点。通过前两个数组维护出 \(s_{x,i}\),及 dfs 序小于等于 \(x\) 且深度在 \([dep_x,dep_x+2^i)\) 之间的所有点 \(y\) 中,\(\sum v_y\oplus(dep_y-dep_x)\) 的值。对于查询。先把 “\(x\) 子树” 弱化为 “dfs 序小于等于 \(x\)”。可以通过 \(s\) 倍增查询出来。再找到 \(pre_x\) 及 dfs 序中上一个 \(x\) 深度等于 \(x\) 的点。差分一下即可求出子树。

  • 【PR #2】背包

    2024.11.13

    考虑暴力,\(f_{x,i,j}\) 表示 \(x\) 子树内,删了 \(i\) 条边,当前连通块权值和为 \(j\) 是否可行。这样 \(j\) 这维状态数是 \(\mathcal{O}(K(R-L))\) 的,原因是剩下的 \(i\) 个连通块权值都在 \([L,R]\) 间,总共不在当前连通块的权值和是在 \([K\cdot L,K\cdot R]\) 间的。

    剪枝:对于 \(a<b<c\) 满足 \(f_{x,i,a}=f_{x,i,b}=f_{x,i,c}=1\)\(c-a\le R-L\),则 \(b\) 是无用的。删去后状态数即为 \(\mathcal{O}(K)\) 的,可以通过。

  • UOJ705 黄忠庆功宴

    2024.11.14

    首先对于 \(1\le k<P\),一定存在 \(1\le a,|b|\le \sqrt P\),满足 \(\frac ab\equiv k\pmod P\)

    证明:令 \(B=\sqrt P\)。考虑模 \(P\) 下的集合 \(\{bk\ |\ 0\le b\le B\}\),那么由抽屉原题,一定存在 \(b_1,b_2\) 满足 \(|k(b_1-b_2)|\le B\),又因为我们可以同时将 \(b_1,b_2\) 减一至其一为 \(0\),故一定存在 \(b'\) 满足 \(|kb'|\le B\)。所以存在 \(0\le |b|\le B\),满足 \(0\le bk\le B\),因此 \(\exist 0\le a\le B,a-bk=0\)。命题得证。

    考虑对于每个 \(k\) 找到对应的 \(a,b\)。枚举 \(a\),令 \(v'_i=v_{ai}\),那么询问及为在 \(v'\) 上进行步长为 \(b^{-1}\) 的跳跃。因为 \(b\cdot b^{-1}=1\)。所以 \(x\) 进行 \(b\) 次跳跃后为 \(x+1\),那么可以把原数组分为 \(b\) 段连续段,前缀和即可。对于 \(-b\le \sqrt P\) 的情况,\(b\) 次后会变为 \(x-1\) ,处理方法是一样的。时间复杂度 \(\mathcal{O}(n^{1.5})\)

  • UOJ597 数圈圈

    2024.11.15

    • 数列非降

      考虑 \(y=1\),及不用关心环数。考虑子序列 \(\{p_k\}\),一个点会连出一条边当且仅当其在子序列中,考虑其贡献:对于 \(p_i\),他能连向 \(a_{p_i}\) 个点,但有 \(i-1\) 个点被前面的连向了,故方案数为 \(a_{p_i}-i+1\)。每个点之独立的,总贡献即为 \(\prod\limits_{i=1}^k(a_{p_i}-i+1)\)。若 \(y\neq 1\),分类讨论:如果 \(a_{p_i}<p_i\),则加入 \(p_i\) 无论如何也形成不了新环,故贡献仍是 \(a_{p_i}-i+1\);否则考虑包含 \(p\) 的链的链尾 \(q\),有 \(q<p\),所以有且仅有一种方案形成新环,贡献为 \(a_{p_i}-i+y\)。可以通过简单 dp 求出贡献和,时间复杂度 \(\mathcal{O}(n^2)\)

      剩下的部分要多项式,不会。

    • 数列非增

      考虑特殊性质 \(a_i>b_i\),我们只需倒序 dp,dp 过程和上面一样。否则,对于每个满足 \(a_i<b_i\)\(a_i\ge i\)\(i\),令 \(a_i\gets b_i\),拿新的 \(a\) 数组跑特殊性质 \(a_i>b_i\) 即可。证明不会。

  • CF2026F Bermart Ice Cream

    2024.11.16

    建出操作树,我们只需动态维护背包,支持前面删除,后面加入,并且支持撤销操作。考虑维护两个栈,分别表示前后缀,加入时可以 \(\mathcal{O}(1)\),删除时若当前栈不为空,直接删除,若为空,则把剩下的元素(及另一个栈),拿出来平均分为两半,分别变为新的前后缀即可,均摊下来总复杂度 \(\mathcal{O}(n)\)。加上维护背包总时间复杂度 \(\mathcal{O}(qV)\)

  • CF720D Slalom

    2024.11.18

    为去重,我们优先向右走。若往上走,那么再向右拐时一定是贴着某个矩形的左上角,设 \(f_{i,j}\),显然有 \(f_{i,j}\gets f_{i-1,j}\),在考虑从下面转过来,有 \(f_{i,j}\gets f_{i-1,k}\),其中 \(k\le j\) 且中间无障碍。扫描线维护 \(f\),第一种转只需要遇到障碍区间推平。第二种转移只有 \(k\) 次,线段树二分找到最小的 \(k\),再查询区间和即可。时间复杂度 \(\mathcal{O}(n\log n)\)

  • BSOJ2398 战争

    2024.11.19

    维护时间轴。把操作差分到树上,可以用启发式合并求出每个点的合法区间。但显然无法支持查询。由于求最大深度。我们只需再点 \(x\) 时找出其改变的区间即可。剩下的一定会在 \(x\) 的子树算出。

    发现 lca 处减去贡献时改变的区间是难维护的。实际上这些区间一定会在子树算过,我们不用关心。故只需找出加贡献是时扩展的区间即可。总时间复杂度 \(\mathcal{O}((n+m)\log^2m+q\log m)\)

  • [CTS2024] 投票游戏

    2024.11.21

    注意到后被票出的人的票一定少,我们只需算出最终得票 \(c_x,c_y\) 即可。对于链的情况:假设我们已经算出了 \(x+1\) 的答案,而 \(x\) 的最终得票只有两种状态:若 \(b_{x+1}+a_x>c_{x+1}\),则 \(x\) 一定先票出,即 \(c_x=a_x+b_{x+1}\),否则 \(c_x=a_x\)。ddp,我们把这两种状态记为 \(0/1\),其值记为 \(val_{i,0/1}\)。可以根据 \(a,b,c\) 的大小维护出转移矩阵,修改时也只会影响 \(val\) 改变的位置的转移矩阵,而 \(val_x\) 只和 \(a_x,b_{x+1}\) 有关,故修改量是 \(\mathcal{O}(1)\) 的。若不是链,考虑再加个重剖,我们把状态的定义改为强制重儿子 会/不会 对当前点贡献。而 \(val_x\) 之与重儿子的 \(b\) 值,轻儿子的 \(b,c\) 值,和 \(a_x\) 有关,故修改只会改 \(\mathcal{O}(\log n)\) 个点的转移矩阵。对于求 \(val_x\) 的值,可以把 \(x\) 的轻儿子的 \(c\) 加进平衡树中,再在平衡树上二分得到。总时间复杂度 \(\mathcal{O}(n\log^2n)\)

  • BSOJ2421 最小值

    2024.11.22

    分治,记两序列的前后缀最小值分别为 \(\{A_l\sim A_{mid}\},\{B_l\sim B_{mid}\},\{C_{mid+1}\sim C_r\},\{D_{mid+1}\sim D_r\}\)。枚举长度 \(len\),对于所有可能的左端点,一定是前一半取得前缀 min,后一半取的后缀 min,维护分界点的指针。分类讨论:若两序列的最小值在同侧,可以直接维护 \(|A_i-B_i|,|C_i-D_i|\) 的最小值,若不在同侧。我们发现一边是递增的,一边是递减的,二分出交点位置即可找出最小值。时间复杂度 \(\mathcal{O}(n\log^2n)\),全部使用双指针可以做到 \(\mathcal{O}(n\log n)\)

  • CF1450H Multithreading

    2024.11.26

    序列确定时,可以维护一个栈,若栈顶与相邻颜色相同,则弹栈,否则加入,答案即为最终栈的大小。暴力 dp 可以做到单次 \(\mathcal{O}(n^2)\)。一个性质是一个数是否弹栈与栈的大小的奇偶有关,但这不好优化。继续观察发现其实是否弹栈只与当前颜色和下标奇偶性有关。故我们可以将其钦定为 \(1/-1\) 的权值,答案,及最终栈的大小即为权值和的绝对值除以 \(4\)。若不被 \(4\) 整除则一定不合法。记 \(k\)? 个数,\(y\) 为不为 ? 的权值和,整理式子得:\(\frac1{2^k}\sum\limits_{i=0,2|i+x}^k|i+x|\binom ki\)。拆开绝对值会得到 \(\sum\limits_{i=0,2|i+x}^{l}\binom ki\) 的形式。整除不好处理,但注意到 \(\binom nm=\binom{n-1}m+\binom{n-1}{m-1}\),故可以将式子变为 \(\sum\limits_{i=0}^{l}\binom {k-1}i\)。得到一个容易支持 \(k,l\) 加减 \(1\) 的式子。


    题外话:若本题为区间修改怎么做呢?

    问题变为多次给定 \(k,l\) 问答案,注意到我们是可以做到 \(\mathcal{O}(|k-k'|+|l-l'|)\) 的时间从 \((k,l)\) 得到 \((k',l')\),拿莫队维护即可。时间复杂度 \(\mathcal{O}(n\sqrt n)\)

  • P11262 [COTS 2018] 题日 Zapatak

    2024.11.27

    小 trick。记两个不同的数为 \(x,y\)。使用 sum 哈希维护 \(\sum val_i\),做差得 \(val_x-val_y\)。再维护 \(\sum val_x^2\),做差得 \(val_x^2-val_y^2\)。两式相除有 \(val_x+val_y\),可以解出 \(val_x,val_y\),从而得到 \(x,y\)

  • CF1270H Number of Components

    2024.11.28

    不难发现答案为 前缀 min 大于 后缀 max 的位置的个数。枚举后缀 max 的值 \(v\),我们把 \(\le v\) 的数看作 \(0\),其他看作 \(1\),那么 \(v\) 合法当且仅当原序列是 111...000 的形式,即不存在相邻的 01

    对于每个 \(a_i<a_{i+1}\),只有在 \(v\in [a_i,a_{i+1})\) 时,当前位置会形成 01。故我们只需统计没被任何区间覆改的 \(v\) 的个数即可。容易用线段树维护 区间 min,区间最小值个数 实现。时间复杂度 \(\mathcal{O}(n\log n)\)

  • P7729 交通运输

    2024.12.4

    摆了。

  • gym103260K Rectangle Painting

    2024.12.6

    首先假设没有复染黑。对于一个白点 \((x,y)\),我们就在 \(x\) 上打上标记,横坐标 \(x\) 的答案即为标记的 \(\min\)。用线段树维护标记,初始时会在根节点上打上 \([0,V]\) 的所有标记,修改即为删除标记。假设当前在结点 \(p\),若不会再往下递归,则标记一定存在,直接删除标记即可,否则若标记存在,只下传当前标记即可。拿 set 维护标记可以做到 \(\mathcal{O}(n\log^2n)\)

    若有重复染黑,考虑找到所有没有染黑的区间修改即可,复杂度可以颜色段均摊掉。

    感觉是一种比较新奇的标记维护方式。对于无法合并的标记,可以尽量永久化,下传只传必要的即可。

  • [CTS2024] 字符串游戏

    2024.12.16

    首先将去前缀变为去后缀,记 \(occ(i,j)\)\(s[i:j]\)\(s[1:j]\) 中的出现次数,那么有转移式:\(f_i=\max\limits_{j<i}\{occ(j+1,i)-f_j\}\)。利用决策单调性可以做到 \(\mathcal{O}(n\log^2n)\)

    注意 \(l<l'\) 时有 \(occ(l,r)<occ(l',r)\)。故我们只需保留一段递增的 \(f\) 即可,可以拿单调栈维护,但这样并没有优化复杂度。观察到对于任意两元素 \(p,q(p<q)\),有 \(occ(q+1,i)-q\le occ(q+1,p)-f_q\le f_p\),故一个点是否被弹栈之和其之后的转移有关!我们只需从栈顶枚举转移并弹栈,直到无法弹栈即可。计算 \(occ\) 可以使用树状数组扫描线,时间复杂度 \(\mathcal{O}(n\log n)\)

  • UOJ577 打击复读

    2024.12.16

    建 SAM,对每个结点 \(x\)(长度区间 \([L_x,R_x]\))统计:\(|\operatorname{endpos}(x)|\sum\limits_{u\in\operatorname{endpos}(x)}wr_u\sum\limits_{i=L_x}^{R_x}wl_{u-i+1}=|\operatorname{endpos}(x)|\sum\limits_{u\in\operatorname{endpos}(x)}wr_u(sl_{u-L_x+1}-sl_{u-R_x})\)。难点在于 \(sl\) 的部分,因为其下标有一个偏移量并且时变量,这是难以快速统计的。考虑如何消除偏移变量,建出反串 SAM 的 parent 树(正串后缀树),找到 \(s[u-L_x+1:u]\) 对应的节点,之前的起始下标变成了一段后缀,偏移量变消除了,对于 \(R\) 是同理的。使用倍增定位结点是 \(\mathcal{O}(n\log n)\) 的,离线下来并查集可以做到 \(\mathcal{O(n\alpha(n))}\) 甚至 \(\mathcal{O}(n)\)

    加上修改考虑反转整个串变为修改 \(wr\),把每个 \(wr\) 的贡献拆下来即可。总时间复杂度 \(\mathcal{O}(n+q)\)

  • UOJ608 机器蚤分组

    2024.12.16

    首先转为最长反链,容易发现存在最优解使得所有串长度相同,不难用调整法证明。考虑从大到小枚举长度,若出现过在长度 \(l\) 重复串,则会在 \(i\in[1,l]\) 的答案减去 \(l-i+1\),此时对于 \(\forall i\le l\),其答案一定不优于 \(l+1\)。故只需找出最小的 \(l\) 满足所有长度为 \(l\) 的串两两不同。

    把询问离线下来扫描线 \(r\),对于 parent 树的每个节点,维护出当前 endpos 集合 \(S_x\),再开一棵线段树维护每个左端点的答案,对于当前 \(S_x\),我们会对右端点不为 \(\max\{S_x\}\) 的位置打上不合法标记。具体地,设 \(x\) 当前最大值为 \(p\),则 \(x\) 下一次更新最大值时会对 \((p-len_x,p-len_{fa_x}]\) 打上标记。考虑维护更新最大值的过程,一次更新一定是更新一段到根链,直接维护连续的 \(p\) 总复杂度是均摊 \(\mathcal{O}(n\log^2 n)\) 的。实际上这就是 LCT 的 access 过程,拿 LCT 实现即可,复杂度不变。

    P6292 也是类似地维护方式。

  • CF1979F Kostyanych's Theorem

    2024.12.21

    建反图,递归构造。由抽屉原理可知一定存在 \(deg\le 1\) 的点。考虑找到这个点,分类讨论:

    • \(deg_x=1\),则把 \(x\) 删除,原图变为 \(n'=n-1,m'=m-1\) 个点的图,递归下去即可,回溯时维护出哈密顿回路,将 \(x\) 插入 首/尾 即可(因为 \(deg_x=1\))所以一定存在合法方案;
    • \(deg_x=0\),此时原图一定存在 \(deg_y\ge 2\),找到任意一个 \(y\),删去 \(x,y\),原图变为 \(n'=n-2,m'\le m-2\),继续递归。回溯时将 \(x\) 插入尾部,再把 \(y\) 插入 \(x\) 后即可。

    增量法/递归子问题 是解决构造题的利器!

  • [CEOI2023] Grading Server

    2024.12.23

    首先将原问题变成四元组 \((A_1,f_1,A_2,f_2)=(c_1-f_2S,f_2,c_2-f_1S,f_1)\),即“攻击”和“可强化次数”。原问题中的攻击即为 \((A_1-A_2,f_1,A_2,f_2)\),破盾即为 \((A_1-A_2,f_1,A_2,f_2)\)(下记“强化”)。当一方的 \(A,f\) 均为 \(0\) 时即为输。观察一些简单的性质,发现我们真正要处理的只有 \(A_1,A_2\in[0,S)\) 的情况,其他情况有固定的策略。

    考虑一些无脑策略,比如先手一直强化,那么后手必然进攻,一回合后有 \(A_1\) 会增加 \(\Delta_1=S-A_2\)(同理有 \(\Delta_2\))。\(f_1\) 回合后有 \(A_1'=A_1+\Delta_1f_1\),若其 \(\ge S\) 则先手必胜。同理先手可以先攻一次,然后后手不断强化,有 \(A_2'=A_2-A_1+f_2\Delta_2<S\)。化简有 \(\Delta_1f_1<\Delta_2,\Delta_2f_2<2S\)。这样的话状态数就是 \(\mathcal{O}(S^2\ln S)\) 的了。

    还能优化吗?我们使用另一个稍微强点的策略,先手先强化 \(x\) 次后再进攻一次。那么后手必会攻击 \(x\) 次,故无论如何后手攻击必会满足 \(A_2'\le A_2-(A_1+\Delta_1x)+f_2(S-(A_1+\Delta_1x))=A_2-A_1-(f_2+1)\Delta_1x+f_2\Delta_2\)。根据上面有 \(A_2'\le S-(f_2+1)\Delta_1x\)。故 \(\Delta_1'\ge(f_2+1)\Delta_1x\)。此时先手再强化 \(f_1-x\) 次,有 \(2S\ge A_1'\ge(f_2+1)\Delta_1x(f_1-x)\)(因为要被后手打一次所以是 \(2S\))。取 \(x=\frac {f_1}2\)\(f_2f_1^2\Delta_1\le 8S\)。注意到 \(\Delta_2\) 这维有单调性,我们可以记另外 \(3\) 维再二分,这样状态数为 \(\mathcal{O}(\sum\limits_{f_1=1}^S\frac{2S}{f_1^2}\ln\frac{2S}{f_1^2})\approx\mathcal{O}(S\ln S)\)。可以通过。

    对于无法从很强性质下手的这类问题,可以从简单情况入手,不断缩小范围,剩下的直接暴力即可!

  • CF1975G Zimpha Fan Club

    2024.12.25

    忘了这个套路了,记一下

    首先把首尾的非 * 字符先去掉后,此时首尾比存在一个串的字符为 *。若两个串都有 * 则一定有解,否则我们记有 * 的串为 \(s\),另一个为 \(t\)。其中 \(s\)* 分割为若干个子串 \(\{p_1,p_2,...,p_k\}\)。我们的目标是再 \(t\) 上同样找出 \(k\) 段子串(段与段之间不一定连续)是的于 \(p\) 两两匹配。通配符的匹配问题是经典套路,具体地,我们为每个字母映射一个非 \(0\) 权值,通配符 - 的权值为 \(0\)。记两个串权值序列为 \(A,B\),那么在位置 \(i\) 匹配等价于 \(\sum\limits_{j=1}^m(A_{i-m+j}-B_j)^2A_{i-m+j}B_j=0\),拆开就是个差卷积的形式。

    但是原问题有 \(k\) 段,不可能对每段用卷积判一次。注意到我们只关心每个串第一次匹配的位置。那我们直接从小到大枚举这个位置再判断即可。一次判断一个位置也是不行的,若一次确定 \(k\) 个位置,那么 \(s\) 取的子串长度为 \(|p_i|+k\),直接取 \(k=|p_i|\) 即可。时间复杂度 \(\mathcal{O}(n\log n)\),要做很多次卷积,常数巨大。

  • CF1844G Tree Weights

    2024.12.28

    很久以前 gyh 讲过这题。

    \(1\) 为根,考虑还原出深度数组。记 \(p_i=\operatorname{LCA}(i,i+1)\),我们知道 \(val_i=d_i+d_{i+1}-2d_{p_i},d_1=0\)。直接消元是不行的。但观察到 \(d_{p_i}\) 的这个系数 \(2\),也即 \(p_i\) 这一项贡献始终为偶数,那么我们可以快速求出 \(d_i\) 的奇偶性。扩展一下,我们知道奇偶性后,就能快速推出 \(d\) 在模 \(4\) 意义下的值,以此类推:我们知道了 \(d_i\mod 2^k\) 后,就能快速递推出 \(d_i\mod 2^{k+1}\)。最后在带回去检查是否合法即可。

    这算是一中巧妙的消元方式,根据系数把第三个变量变成常数来消。

  • [Xmas2021] Count Me

    2024.12.31

    首先将问题转化为每次选择 01,变成 01。在每个数中间加上一个时间戳,表示其左右被操作的时间。那么对于 0,其左边的时间戳大于右边,1 同理。故原问题转化为对长为 \(n+1\) 的排列计数,相邻两数间可能有相对大小限制。

    上面的转化不是人能想的,但是我们可以思考转化后的东西怎么做。

    对于只有小于或大于的限制是简单的,考虑把大于容斥成 \(无限制 -小于\),这样就能 dp 了。直接转移是 \(\mathcal{O(n^2)}\) 的。加上分治 NTT 可以做到 \(\mathcal{O}(n\log^2n)\)

posted @ 2025-12-10 22:21  real60t  阅读(3)  评论(0)    收藏  举报