do_while_true

一言(ヒトコト)

杭电多校 2026

第一场

1001

答案一定出现在 \(x+a_i\) 最小最大,以及 \(y+b_i\) 的最小最大,的乘积之中。为了照顾不选的情况,再将 \(a\)\(b\) 中塞入两个 \(0\) 即可。

1004

菊花的情况是 exchange argument,经过推导得到 \(\frac{b}{a}\) 更小的排在前面,根据 01 on Tree 那个题的结论,每次将 \(\frac{\sum b}{\sum a}\) 最小的连通块,与其根的父亲所在连通块,合并即可。用一个 set / 可删堆维护所有连通块的 \(\frac{\sum b}{\sum a}\)

1005

std 的做法是将 \(a^xb^y\) 拼出所有数。队友的做法是每拼一段 baaaaaa 就是 \(+1+2+3+4+5+6+7\),贪心选取就可以做到 \(\mathcal{O}(\sqrt k)\) 的长度。总之思路就是写个暴力,然后试一些特殊的构造,把目标拼出来。

1006

点亮 \(a_i\)\(1\) 时,\(c=\)\(i\) 之前的 \(10\) 个数》+《\(i\) 之后的 \(01\) 个数》\(+1\)(即 \(i\) 本身的连续段)。

用期望的线性性拆出来,也就是对于每个位置 \(p<i\)\(P(w_p=1,w_{p+1}=1)\cdot a_i\),发现相当于点亮时间 \(t_p<t_i<t_{p+1}\),所以概率是 \(\frac{1}{6}\),算上后半段,一共有 \(\max(0,i-2)+\max(0,n-i-1)\)\(p\),所以答案是 \(\sum\limits_{i=1}^n \frac{1}{6}(\max(0,i-2)+\max(0,n-i-1))a_i\)

1008

观察到最劣情况下,分出的段长为 1+2+3+...,所以最长的一段不超过 450,那么可以设 \(f_{i,j}\) 表示从 \(i\) 开始长度为 \(j\) 的这一段,往后接最长能接多少个。如果从 \(f_{p,k}\) 转移而来,如果 \(k>j\) 那么可以直接后缀和优化掉,如果 \(k=j\),还需要保证 \(p\) 开头的长度为 \(j\) 的串,字典序比 \(i\) 开头的长度为 \(j\) 的串更大,那么这部分可以利用后缀数组的 height,处理出所有后缀长为 \(j\) 的前缀的排名,那么转移就变成二维偏序了。

时间复杂度 \(\mathcal{O}(n\sqrt n\log n)\),由于是树状数组的 \(\log n\) 常数较小可以通过。

1010

最逆天之题,根本不会做博弈论,我只能投降。

首先 \(n=1\) Bob 必胜,\(n=2\) Alice 必胜。\(n=3\)\(x_1>x_3\) Alice 必胜,\(x_1\leq x_3\) Bob 必胜。

此时观察 \(n\geq 3\) 时相当于军备竞赛,两个人都同时往中间尽可能地移动,令 \(s_a\) 为前半部分 Alice 的总和,\(s_b\) 为后半部分 Bob 的总和,如果谁的严格大谁就赢了。这个证明是比较容易的,如果一方严格大,它一定能取完就取完,那么对方无论怎么操作,最终缩减到 \(n=3\) 的时候还是严格大的那个赢(无论它变成先手还是后手)。

但是在 \(s_a=s_b\) 时,他们要争抢成为 \(n=3\) 时的后手,还要保证不能被对方多取额外一堆(导致变成对方严格大)。考虑 \(n=1\) 的时候后手必胜,我们相当于抢 \(n=1\) 的后手,那么此时就可以类比,将中间三堆视作同一堆,去争抢成为最后 \(n=3\) 的后手。所以相当于 \(s_a\) 删掉最右边的一个,\(s_b\) 删掉最左边的一个,再进行比较 ...... 依次类推,相当于前缀和与后缀和,比较一下字典序谁严格大。

这个地方正着思考了很久,总是得出不完备的结论,后来刷新脑内缓存,利用类比思考出来了正确的做法。

对于奇数的情况是这样做,字典序相同判 Bob 赢。对于偶数的情况类比应该大致是相同的,只不过字典序相同判 Alice 赢,这里没有细推,对拍过了那就是对的。

1012

先视作 \(x_i,y_i\) 表示为 \(v_y\) 会给 \(u_x\) 贡献 \(k\) 倍,建图让 \(y\) 连向 \(x\),每个 \(v_i\) 会给自己的 \(u_i\) 贡献一倍。先构造得松一些,分析余数,能不能让 \(\bmod k\) 是满足的,发现 \(u_i\equiv v_i\pmod k\),那么先令 \(v_i \gets u_i \bmod k\),再从此基础上进行调整。

此时再调整只能让 \(v_i+k\),那么就会使得 \(u_i+k\),并且 \(i\) 的出点 \(j\) 都会 \(u_j+k^2\),此时将所有数都对 \(k\) 整除,问题的规模除以了一个 \(k\),那么预估 \(\mathcal{O}(\log u)\) 轮就能归约到一个边界情况。

这里出现了问题,因为有负数的存在,模出来定哪个数,向 0 取整还是向下取整,\(u\) 的值还在一个负数上循环,出现一些边界问题,在这里卡住了。事实上,最开始就是在模空间下分析的,后面逐层迭代也应该去想在模意义下是在做什么。

事实上,如果每次都让 \(v_i\) 变为 \([0,k-1]\) 中的数,相当于确定好了原问题的 \(v_i\bmod k^t\) 的值,其中 \(t\) 是迭代的轮数。那么迭代到 \(k^t>2\cdot 10^9\),由于要求 \(v\in [-10^9,10^9]\),就能区分出真正的 \(v\) 是正数 \(\leq 10^9\) 还是负数,取模之后变成 \(>10^9\) 的了。由于真正的 \(v\) 可能超级大,不在 \([-10^9,10^9]\) 之中,所以还要最后 check 一下对不对。

1002 (补)

复制一下题解:

找到一组链剖分,把链垂直摆放,链上的左子树放在左边,右子树放在右边,子树递归下去画。

\(y_{fa_i} < y_i\) 这条限制使得高度至少得是 \(\Omega(n)\),因此需要分析画面的宽度。记链上最大的左子树大小为 \(\alpha\),最大的右子树大小为 \(\beta\)

如果使用重链剖分,不失一般性令 \(\beta\) 对应子树的深度比 \(\alpha\) 大,可以得到宽度的递推式:

\[\begin{aligned} W(n) &= \max_{\alpha \le n/2, \beta \le (n-\alpha)/2} (W(\alpha) + W(\beta)) + 1 \\ &= W(n/2) + W(n/4) + 1 \\ &= \mathcal{O}(n^{\log_2 \phi}) = \mathcal{O}(n^{0.695}) \end{aligned} \]

无法通过,需要优化。

不妨稍稍修改一下重链剖分:找到一条链使得 \(\alpha + \beta \le n/2\)。这条链一定是存在的,可以归纳证明:从根向下走到某节点,根到该节点的链满足 \(\alpha + \beta \le n/2\) 的条件,当前左右儿子的大小分别是 \(L\)\(R\)

  • \(\alpha + R \le n/2\),走左儿子;
  • \(\beta + L \le n/2\),走右儿子;

上面的两个条件无法同时不成立,因此链存在,故而可以进行链剖分。这样链剖分的宽度变为:

\[\begin{aligned} W(n) &= \max_{\alpha + \beta \le n/2} (W(\alpha) + W(\beta)) + 1 \\ &\le 2W(n/4) + 1 \\ &\le 2\sqrt{n} \end{aligned} \]

可以通过。

这样子改重链剖分的契机是什么?

宽度为 \(W(n) = \max\limits_{\alpha,\beta} (W(\alpha) + W(\beta)) + 1\) 的这个构造摆在这里,而直接重链剖分的递推式中 \(\alpha\)\(\beta\) 不平衡,尝试将它平衡到一个比较优的地方,就让它们同时小一点。

那么可能存在一个 bound,使得每次往下走的时候能控制 \(\alpha\)\(\beta\) 比较小。同时 \(\leq n/2\) 有点太弱了,因为每次往下走时 \(L,R\)\(\alpha\)\(\beta\) 是一个 chkmax,所以应该像一个 \(\sum \leq n/2\) 的 bound。

1013 (补)

这个题的思路与 Tutte 矩阵求解一般图最大匹配有异曲同工之处,少了容斥,多了个变元去描述红边个数。

考虑令 \(A_{i,\pi_i}\) 为二部图 \(i\to \pi_i\) 这条边的边权,不存在则为 0。则积和式 \(\text{perm}A=\sum\limits_{\pi}\prod\limits_{i=1}^nA_{i,\pi_i}\) 可以描述所有完美匹配。

此前遇到的题,例如某次省队集训题,均是用行列式去描述,这里有另外的思路是积和式去描述。

那么令 \(x_{i,j}\) 为两两不同的变元,\(z\) 为描述红边的变元,那么令 \(A_{i,j} = \begin{cases} x_{i,j}, & c(i,j) = 0, \\ x_{i,j}z, & c(i,j) = 1. \end{cases}\),则求其积和式,提取 \([z^k]\) 即为所有 \(k\) 条红边的完美匹配,那么存在完美匹配当且仅当 \([z^k]\text{perm}A\) 是非零多项式。

由于变元之间线性无关,所以正负不影响,故可以将积和式视作行列式,那么利用 Schwartz-Zippel 在 \(\mathbb{F}_p\) 下给每个变元随机权值,作行列式,再对 \(z\) 进行拉格朗日插值即可求出对应系数。这里朴素实现时间复杂度 \(\mathcal{O}(n^4)\)

还要考虑怎么优化到 \(\mathcal{O}(n^3)\),以及构造方案,但我已经困了。

第六场

1001 Grand Mex

最后一步导致 0 一定存在,之后发现答案只能是 1 或者 2。只需要以任意点为根,每条边定向为父亲指向儿子(操作时父亲清零,儿子 +1),由于每个点只有一个父亲,那么权值只有 0 和 1。

现在问题是判定答案是否可以为 1,相当于给边定向,\(f_{x,0}\) 表示 \(x\) 的父边指向父亲 \(fa\) 时,\(x\) 子树内是否有合法方案;\(f_{x,1}\) 表示父亲指向 \(x\) 时,\(x\) 子树是否有合法方案。令 \(\texttt{last1}\)\(\texttt{last2}\) 分别代表节点 \(x\) 参与的最后一次操作和倒数第二次操作对应的相邻节点,根据 \(\texttt{last1}\)\(\texttt{last2}\) 是否等于 \(fa\) 讨论转移即可。构造方案根据 dp 过程倒推即可。

std 的做法是令变量 \(in(e,v)\) 表示边 \(e\) 是否指向 \(v\),那么变成 2-SAT 问题。

1002 Dice Tower

观察到一个骰子对面被遮会 -7,有一对面被遮之后讨论一下不同情况。如果没有一对对面同时被遮,那么遮住 1,2,3 面分别会 -1,-3,-6。这样分类讨论会简单一些。

1003 Phi Master

\(\varphi(xy)=\varphi(x)\varphi(y)\prod \frac{p}{p-1}\) 其中(\(p\)\(\gcd(x,y)\) 的质因子),\(a_i\leq 10^7\) 的质因子最多 \(8\) 个,所以质因子子集不会很多,直接对每个 \(x\) 枚举质因子子集,子集相同取最大的 \(a_i\)。直接做的算量是 \(10^7\times 2^8\) 大小。

利用算错不会更优。令 \(f_x\) 表示质因子集合为 \(x\) 的质因子集合时的 \(\max a_i\prod \frac{p}{p-1}\),那么初始的时候对每个 \(a_i\) 枚举其不出现重复质因子的因数 \(d\)\(f_d=a_i\prod \frac{p}{p-1}\),其中 \(p\)\(d\) 的质因子。再做一遍 Dirichlet 前缀 max 即可。时间复杂度 \(\mathcal{O}(n2^{\omega(a)}+a\log\log a)\)

1006 Gcd Master

\[\begin{aligned} f_k &= \sum_{1 \le i \le k} \gcd(i, k) \\ &= \sum_{1 \le i \le k} \sum_{d \mid i, d \mid k} \varphi(d) \\ &= \sum_{d \mid k} \varphi(d) \left\lfloor \frac{k}{d} \right\rfloor \end{aligned} \]

可以简单 \(\mathcal{O}(n\log n)\) 计算得到。

\[\begin{aligned} g_k &= \sum_{k \le j \le n} \gcd(j, k) \binom{j}{k} \\ &= \sum_{k \le j \le n} \sum_{d \mid k, d \mid j} \varphi(d) \cdot \binom{j}{k} \\ &= \sum_{d \mid k} \varphi(d) \sum_{j \ge k, d \mid j} \frac{j!}{k!(j-k)!} \end{aligned} \]

\(k = ad\), \(j = bd\)令某个 \(d\),需对所有 \(1 \le a \le \left\lfloor \frac{n}{d} \right\rfloor\) 求出:

\[\begin{aligned} h_a = \varphi(d) \sum_{b=a}^{\left\lfloor \frac{n}{d} \right\rfloor} \frac{(bd)!}{(ad)! \cdot ((b-a)d)!} \end{aligned} \]

\((bd)!\)\(((b-a)d)!\) 的差卷积,单次复杂度为:\(O\left(\left\lfloor \frac{n}{d} \right\rfloor \log \left\lfloor \frac{n}{d} \right\rfloor\right)\)。求出后累加:\(g_{ad} \mathrel{+}= h_a\) 即可。总时间复杂度 $ \sum\limits_{d} \frac{n}{d} \log \left(\frac{n}{d}\right) = O(n \log^2 n)$。

1007

这里 fwt 采用 Kronecker Product 的理解方式,相关的阅读材料可以见: https://www.cnblogs.com/do-while-true/p/17098483.htmlhttps://codeforces.com/blog/entry/96003

现在仅需要构造每一维的线性变换,之后利用 fwt 的手法做出最终的线性变换即可。对于 6*6 的下标乘法循环卷积,可以直接试着搜值在 \([-1,1]\) 里的矩阵是否满足(注意需要有逆),也可以先把 2*2 和 3*3 的下标乘法循环卷积搜出来,将原问题的 \(f_i\) 其中 \(i=2a+b\) 其中 \(b\in [0,2),a\in [0,3)\) 视作 \(g_{a,b}\),再对 \(g\) 行作 3*3 的线性变换,再对 \(g\) 的列作 2*2 的线性变换,再将 \(g\) 映射会 \(f\) 就得到了 6*6 对应的线性变换。

该问题得到解决。

posted @ 2026-07-22 01:52  do_while_true  阅读(184)  评论(2)    收藏  举报