2025.9
Kingdom of Jagaica
考虑必要条件,显然要有图连通。考虑一条这样的路径 \(s\to x\to s\),除了 \(s,x\) 之外的点都被走了两遍,所以等价于将 \(a_x\) 和 \(a_s\) 同时异或 1。再考虑拼上一条 \(s\to t\) 的路径,等价于将某一条 \(s\to t\) 的路径上的点异或 1。总异或和等于 \(n\) 的奇偶性,因此必须存在一条 \(s\to t\) 的长度和 \(n\) 同奇偶的路径。满足以上条件的都是合法的。
Mod Graph
好题。
还是考虑充要条件。考虑一些结构,一条从 \(1\to s\) 的路径,如果路径上有偶数个点,我们把它们两两配对来回走动,就可以消去路径上的点影响,可以实现 \(a_s+=1\),并从 \(1\) 移动到 \(s\)。如果图是非二分图那么这样的路径是一定存在的,这种情况下必定有解。如果图是二分图,那么我们只能在两侧轮流移动,二分图的两侧点权之差不超过 \(1\),解一个同余方程即可。
Taxi
好题。
首先一个性质是从 \(1\sim i\) 的最优路径经过的每条边的 \(b_j\) 是严格递增的。这个性质给了我们一个转移的顺序。
按照 \(b_i\) 从小到大依次转移,只需要查询 \(f_i\) 的值,并以此更新 \(f_j\)。考虑利用点分治的结构,把一次更新拆到 \(\log\) 个分治层上,在一层上的操作就是插入线段、单点查询,用李超树维护即可。
如果没有观察到第一个性质也是可做的,只不过可能会稍微麻烦一点。
Protecting Kingdom
简化题意,找树上包含点数尽量多的长度不超过 \(w\) 的路径。
长链剖分,设 \(f_{u,i}\) 表示 \(u\) 子树内长度为 \(i\) 的路径边权和最小是多少。
加入一个短子树容易更新 \(f\),而统计答案时只需要考虑能不能更新原来的答案,在一个特定的区域内做双指针。时间复杂度 \(O(n)\)。
Random Sum
趣题。
引理:对于任意 \(a,B\) 和素数 \(p\ge B\),存在 \(t\le p/B\) 使得 \(at\bmod p\le B\) 或 \(p-at\bmod p\le B\)。
按照 \(t\) 归为一组,一共 \(p/B\) 组。对于组内使用分治 NTT 求出多项式的乘积,组间再使用 NTT 合并。复杂度为 \(O(mB\log^2 m+p^2\log p/B)\)。看着很吓人实际上就是能过,不知道为什么。
Joy of Sushi
有一个 \(O(n^3/w)\) 的简易 bitset 做法。
Efficient Transportation
好题。
不会。
在线求题解。
Permutation Recovery
好题。
考虑 \(a_p=q\) 的位置对应了一个 \(b_q=p\),所以将 \((p,q)\) 看成一条无向边。我们希望将这些边定向,然后建立一张二分图,对于一条 \((u,v)\) 的有向边,在二分图上连接一条 \((u,v')\) 的边,这张二分图存在完美匹配。
一个定理是 \(k-\) 正则图存在完美匹配,所以我们只需定向使每个点度数一致。而若 \(k\) 是偶数,则每个点度数都是偶数,跑一遍欧拉回路就能得到一个完美定向。若 \(k\) 是奇数,则转化为 \(k=1\),这 \(n\) 条边随便定向都可以。
我们已经将边定向,只需求出 \(k-\) 正则图完美匹配,可以简单地 \(O(k^2n\sqrt{n})\)。
TB
一个不太牛的 \(O(n\sqrt n\log n)\) 做法,也许可以 \(O(n\sqrt{n\log n})\)。
一个性质是我们如果关注某个位置,在这个位置成为绝对众数的数只有 \(O(\log n)\) 个。如果能事先找到这些众数,分块维护即可。
对序列做扫描线。【数据删除】
Square Stamping
比较神奇的一道题,但是也有可能是官方题解写的比较神奇。
考虑 dfs(x,y,z)
表示三行分别剩下了前 \(x,y,z\) 个的最小覆盖次数。如果位于最靠右的是一三两行,则直接贪心转移就是正确的。如果最靠右的是第二行,枚举两种转移。可以证明加上记忆化的状态数量为 \(O(n)\)。
官方题解直接略过了。这里证明思路是,考虑第二行如果剩下前 \(y\) 个并且轮到第二行做转移,此时一三两行留下的恰好是在 \(y\) 后面的第一个。所以状态数为 \(O(n)\)。
P6078 [CEOI 2004] Sweets
生成函数入门题,太困难。
2004 年就有这种题了???
写出要求的东西就是:
即封闭形式
我们要求 \([x^a]\) 到 \([x^b]\) 项系数之和。
广义二项式定理
\((1-x)^{-n}\) 的二项式展开是一个无穷和式:\(\sum_{i\ge 0}C_{i+n-1}^ix^i\)。从一种角度理解可以看作一个多项式 \(F(x)=\sum_{i\ge 0}C_{i+n-1}^ix^i\) 具有封闭形式 \(F(x)=(1-x)^{-n}\)。
使用 \(x\) 替换 \(-x\) 可以得到 \((1+x)^{-n}=\sum_{i\ge 0}C_{i+n-1}^i(-x)^i\)。
\(n\ge 0\) 的时候也是成立的,因为我们扩展了 \(C_n^m\) 的定义域。但是这没有什么意义。
回到原题,对于分子我们 \(O(2^n)\) 展开,然后计算分母的贡献,这是一个上指标求和。
Generate Tree From Polygon
最小生成树,考虑 Brovuka。对于每个点找到和它不同色的点中距离它最远的点。
对颜色做分治,用一个 log 的代价去掉了颜色的限制。
相当于两个点集 \(A,B\),对 \(A\) 中每个点找 \(B\) 中的最远点。凸多边形的距离满足四边形不等式,因此决策单调性分治即可。
总复杂度 \(O(n\log^3 n)\)。
Loving You in My Humble Way
Single-Crossing
考虑 \(p_i\) 的逆排列 \(q_i\)。条件就是:
- 对于所有 \(x,y\),\(q_{i,x}\) 和 \(q_{i,y}\) 的大小关系只改变一次。
假设已经确定了 \(a_1\),那么对 \(p\) 做 \(p_{a_1}\) 的置换,然后按照逆序对从小到大排列,就得到了 \(a_2,...,a_m\)。类似地如果知道 \(a_m\) 也可以推出 \(a_1,...,a_{m-1}\)。
考虑如何确定 \(a_1\) 或 \(a_m\) 中的任意一个。一个结论是对 \(p_x\) 做置换后,逆序对数最大的一定是 \(a_1\) 或 \(a_m\) 中的一个。根据这个方法就能找出 \(a_1,a_m\),然后考虑判定。只需将 \(p_{i+1}\) 做 \(p_i\) 的置换然后对逆序对数求和看一看是不是等于实际应该交换的次数。