2025.10
Todolist:118e 的形式化理解方法,做一下 abc426,感觉有点难度,abc425f 的 poly 做法,149d 的 universal 做法,有交合并的复杂度证明,1554e 更快的做法。
[ARC149D] Simultaneous Sugoroku
直接上大暴力,那就是分成 \(<0,>0\) 的部分加一个数,发现是值域有交平衡树合并。注意相同数要合并(但他们仍然存在,因此要用并查集表示指向了哪个数)否则复杂度会错,我也不知道为什么。
CF1554E.You
先来一遍莫反转化为计算倍数的形式。
实际上这样可能并不好做。首先在点上这个限制会非常麻烦,尝试用边描述限制,发现每条边只能给两侧的某一个端点做贡献,大概是一个给边定向的过程,指向的点就是这条边贡献到的 \(a\)。
由于我们考虑的是 \(a\) 而不是删除点的序列,所以只需要考虑定向是否和 \(a\) 构成双射即可,每次根据 \(a=0/1\) 给叶子定向后剥叶子即可得到唯一的定向因此是双射,答案总数是 \(2^{n-1}\)。
现在考虑 \(\gcd\) 的事,我们喜欢剥叶子,知道叶子的 \(a\) 值只能是 \(0/1\),如果 \(k>1\) 至少要求所有的点都是 \(k\) 的倍数,那么叶子必须是 \(0\),定好这些边的向后剥去她们,考虑新的叶子,因为是 \(k\) 的倍数所以大概也能定出向,但是不能保证是 \(k\) 的倍数了,也就是,父亲边怎么定向都不对,那这个 \(k\) 就达不到,否则也是唯一的方案。还有一个小问题,最后的 \(\gcd\) 还是可能是 \(k\) 的倍数,但是可以直接判断的。
剥叶子表现为拓扑排序,这样总复杂度是 \(\mathcal{O}(n^2)\),有 \(\gcd(a,b)=\gcd(a,a+b)\),所以原式的 \(\gcd\) 可以再添上一个 \(\sum a\) 项,这项一定是 \(n-1\),因此 \(k\) 必须是 \(n-1\) 的因数,这就是 \(\mathcal{O}(n \sqrt n)\) 的了。
还有判素因子的优化,但无人在意啊!
[ABC213E] Stronger Takahashi
这个是绝世难题啊,流程就是先从当前能到的点 bfs 扩展能直接走的点。然后打破墙花费 \(1\) 能到的点是这个点为中心 \(5 \times 5\) 的矩形扣掉四个角,这是画一下容易知道的。那么就用所有能更新这个打破墙位置的点更新一下这个位置再标记 vis,因为不能保证第一次更新是最优的。哎看代码就很好说了。
[ABC318Ex] Count Strong Test Cases
分析能答对的条件,原问题是求的每个环上的最小值。那么如果存在一次取不到最小值就不对,应为想要总和不变就需要另一个数别的更小,但原答案已经是最小的了,所以不存在蒙对的情况。
发现答错的条件适合容斥,数一下 A 答对的方案数即可,A 和 B 方案数是一致的。A 答对的要求就是对于每个环,最小值一定放在环中编号最小的点出发的那条边上,同理 B 则是编号最大的点。那么 A 和 B 同时满足的方案数就容易确定,要求一个点同时是编号最小和最大的点,需要连出 \(n\) 个自环,\(Q\) 随意。
对于 A 对的,考虑对于一个确定的 \(P\)(也就是环确定),怎样的 \(Q\) 合法,对于一个环上填的数,要求最小点那条边上放着最小值,其他的可以乱填,也就是 \(c\) 个点的方案数 \((c-1)!\),但是还有一个 \(n\) 个权值分配的方案数,也就是 \(\binom{n}{c_1,c_2,\dots c_k}\),方案数是 \(n!\prod_{i=1}^k \frac{(c_i-1)!}{c_i!}\) 也就是 \(n!\prod_{i=1}^k \frac{1}{c_i}\)。
那么现在可以 dp 了,设 \(f_i\) 表示考虑了 \(i\) 个点的划分成环的 \(\prod \frac{1}{c}\) 之和,转移就是枚举这个环的大小,需要乘上选点的组合数和选出点的排列数(这是个环排列)当然要钦定是最小值所在的环。写出就是 \(f_i=\sum_{j \le i} f_{i-j} \frac{(i-1)!}{(i-j)!j}\)。接下来只需要对转移进行分治 NTT 优化即可。
整理 $$f_i=(i-1)!\sum_{0 \le j < i} \frac{f_{j}}{j!} \times \frac{1}{(i-j)} $$
CF1175G.Yet Another Partiton Problem
首先是按 \(k\) 从小到大,一轮一轮的算。
转化为 \(f_i=\min_{j<i} g_j +(i-j) \max_{k=j+1}^i a_k\),复杂度会乘一个 \(k\)。
没有决策单调性,那么可能的优化就分治一下,复杂度乘一个 \(\log n\)。
现在考虑的是左边的对右边的贡献,是 \(g\) 对 \(f\) 的贡献呐。
有套路的,对左边记一个后缀最大值 \(suf_i\),枚举右边的元素,记前缀最大值 \(pre\),那么由于 \(suf\) 右到左不降,可以双指针求出一个 \(j\),使得 \(i \ge j\) 时最大值是 \(pre\),否则是 \(suf_i\)。
是 \(pre\) 部分的转移是 \(g_{j-1} +(i-(j-1)) \times pre\),是不是李超树呐,是直线 \((-j,g_j)\)。
是 \(suf_i\) 部分的转移时 \(g_j+(i-j)suf_{j+1}\),是不是也是李超树呐,是直线 \((suf_j,g_{j-1}-(j-1) \times suf_j)\)。
现在问题是,是对于 \(j\) 左侧的插入一种线段而右侧插入另一种线段,如果是好维护的操作我们会删除和插入,但是李超树不好删除,那么将其可持久化,就做好了删除一段的版本,另外一棵树维护插入的结果即可。
就是,我们用的是插入一个区间的线段的版本,而不是一个插入所有线段的区间询问。不知道为啥有地方要开 long long,可能是为 \(\inf\) 的 \(f\) 导致的?时间复杂度 \(\mathcal{O}(nk\log^2n)\)。
[ARC182C] Sum of Number of Divisors of Product
值域范围内共有 \(6\) 个质数,记第 \(i\) 个质数是 \(c_i\),答案是 \(\prod_{i=1}^6 (c_i+1)\),考虑加上一个 \(x\) 的影响,设其各个质数的指数是 \(d_i\),那么新答案就是 \(\prod _{i=1}^6 (c_i+d_i+1)\)。
对她拆括号,假设选了 \((c_i+1)\) 项的集合是 \(S\),则新的答案就是 \(\sum_S\prod_{i \in S} (c_i+1) \prod_{i \notin S} d_i\)。
对所有方案求和就是外面再套一层 \(\sum\),把枚举 \(S\) 提到外面,如果设 \(f_{S}\) 表示所有方案的 \(\prod _{i \in S}(c_i+1)\) 之和,根据乘法分配律乘上 \(\prod_{i \notin S} d_i\) 是对的。但是我要用所有的 \(f_S\),因此每个 \(S\) 都要有转移,就改成 \(\sum_{T\subseteq S}f_T\prod_{i \in S-T} d_i \to f_S\)。关注长度再加上长度这一位,再枚举一下转移的数就可以做到 \(\mathcal{O}(nm3^CC)\),其中 \(C=6\)。初值是 \(f_{0,S}=1\),\(S\) 任意。
但是 \(n\) 很大,需要改成矩阵乘法的形式,然后要求的是 \(\le n\) 的,所以再加上一个前缀和即可。
【UNR 6】小火车
其实这个早就做完了,只是迟迟不写代码和迟迟调不出来拖到了如今。
转化,两个集 \(A\) 和 \(B\) 和相等,那么 \(A-B\) 就是 \(0\)。
由鸽巢原理一定有这样的两个集合,因为 \(2^n>p\)。
看着数据范围想要折半,但是不知道和是多少没法折。如果枚举和,那么就是 \(\mathcal{O}(p2^{\frac{n}{2}})\)。
降维的方法考虑二分:如果 \([l,r]\) 中有合法盒子且一侧没有,那么另一侧肯定有,这是有单调性的。现在。真正的鸽巢原理是什么样的?如果 \([l,r]\) 中有 \(>r-l+1\) 个数,那么肯定有一个盒子装了两个数。
现在问题是 \([l,r]\) 中放的数的数量怎么求,左右各放着 \(2^{\frac{n}{2}}\) 个和,\(l\) 在增大,\(r\) 在减小,排序分析单调性双指针可以做到 \(\mathcal{O}(2^{\frac{n}{2}} \log p)\),是严格的。
也就是,二分 \([l,r]\),意思是 \([l,r]\) 中有没有一个和对应了多个子集,check 可以是 \(2^{n/2}\),再套个二分也可以。
枚举左边的元素求右边即可,细节有点多,将加起来要 \(-p\) 的和不用的分开算,vector 还要记达到她的状态。
[ARC174E] Existence Counting
方案数在枚举哪一位不同后是容易计算的。优化发现除了前后缀和外是一个二维数点,可以用 BIT 简单维护。
[Ynoi Easy Round 2025] TEST_176
变化是 \(\le \lfloor \frac{a_i}{2}\rfloor\) 的乘上 \(-1\) 再 \(+a_i\),直接平衡树,需要值域有交。现在是区间限制,只需要在 \(l\) 处插入记下点编号,在 \(r\) 处提取根链 pushdown 一遍即可。
Merge 必须 pushdown,相同值要合并,但是如果第二棵树有也只会有一个,因此不用递归合并。最后算的时候只有初始节点需要 get 一下,因为不会把一棵树的结构删碎。记得 pushup 维护父亲,也可以 split 和 merge 时改,但麻烦。
wow 还有 tag 顺序问题,冷静分析即可。
P4463 [集训队互测 2012] calc
记 \(f(i,j)\) 表示选了 \(i\) 个数,值域是 \([1,j]\) 的答案。有 \(f(i,j)=f(i,j-1)+j \times f(i-1,j-1)\)。注意初值是 \(\forall j,f_{0,j}=1\)。
\(n\) 小而 \(k\) 大,考虑插值,转移的形式可以归纳证明,\(f(i,j)\) 固定 \(i\) 是关于 \(j\) 的多项式。
设 \(f_i(j)\) 是关于 \(j\) 的 \(g(i)\) 次多项式,那么 \(f_i(j)-f_i(j-1)\) 是关于 \(j\) 的 \(g(i)-1\) 次多项式(经典结论)。
也就是把转移方程 \(i\) 和 \(i-1\) 的放到两边,那么右边是 \(f_{i-1}(j-1) \times j\),是 \(g(i-1)+1\) 次多项式。因此有 \(g(i)-1=g(i-1)+2\),那么 \(f(n,j)\) 就是关于其的 \(2n\) 次多项式。
判断是不是多项式,不妨先假设她是,然后模拟一下转移,就像凸性证明一样。
P10143 [WC2024] 代码堵塞
设可见结果的题目集合为 \(S\)。若 \(i \in S\),限制是 \(\sum_{j<i,j\in S} t_j+t_i \le T\),按照 \(i\) 顺序做背包即可,在 \(i\) 时要用确定了前 \(i-1\) 个数 \(S\) 的方案数,\(i\) 必选,后面随意。
若 \(i \not \in S\),则限制是 \(\sum_{j<i,j \not \in S}t_j+\sum_{j \in S}t_j+t_i \le T\),事实上这就是 \(\sum_{j<i} t_j+\sum_{j \in S,j >i} t_j +t_i \le T\),那么按照 \(i\) 逆序做背包即可。\(i\) 必不选,前面随意。
[ARC122D] XOR Game
这个是说,做 \(N\) 组匹配,求异或最大值的最小值。二分却不好 check。因为 \(A\) 选啥 \(B\) 都能跟着选,当然 \(A\) 可以选一个使得 \(B\) 非得选另一个,选了这个后 \(A\) 再选一个答案就相对大些,如果这样做了那也是最大值更小的方案。
直接按位确定,从高到低,如果第 \(i\) 位有 \(k\) 个数是 \(1\),\(k\) 是偶数,那么一定能做到这一位每组匹配都是 \(0\)。匹配一定是 \(0\) 和 \(0\),\(1\) 和 \(1\),也就是匹配集合变小了,要递归处理 \(0\) 和 \(1\),然后答案取最大值,因为两边的匹配都要进行,那么一侧更大总答案就是更大的。
否则,这一位要有 \(1\) 了,可以做到只有一个数这位是 \(1\) 那他就是最大值。考虑这一位是 \(0\) 和是 \(1\) 的集合,求一下各选一个数的异或最小值即可。
P10879 「KDOI-07」对树链剖分的爱
\(u=v\) 平凡。设 \(u<v\),描述一下这个过程,发现 \((v,f_v)\) 是一定要加上 \(w\) 的,如果是两侧都有至少一条边的平凡情况自然,祖先后代的话 \(v\) 是深的。从边界的特性入手递归解决问题。
那么下一步就是枚举一个 \(v\) 的父亲 \(k\),以 \(\frac{w}{r-l+1}\)贡献到 \((u,k)\) 链中,递归做。
这就可以尝试写成 dp 了。设 \(f_{u,v}\) 表示操作链 \((u,v)\),边 \((v,f_v)\) 期望加上的值。转移就像刚才一样。要求 \(u<v\),所以枚举 \(k\) 时要注意。同时这个有点特殊,是从大到小转移,根据状态的正式定义,\(u\) 答案是 \(\sum_{v<u} f_{v,u}\)。\(\mathcal{O}(n^3)\)。
修改形如矩形加,差分,但这个差分也不太容易,因为两维都倒着做所以前缀和改成后缀和,差分也要换个方向,同时矩形边界记得与 \([l,r]\) 取 \(\min\),还有就是不能枚举到 \(j>i\) 了否则前缀和算不全。直接在 dp 数组上差分是对的,可能用的都是统计答案不用的数吧。
P10880 [JRKSJ R9] 莫队的 1.5 近似构造
不要管那么多,先写 dp。设 \(f_i\) 表示考虑了前 \(i\) 个值域数,有若干的区间的答案。
看起来转移要枚举 \(j <l \le r\le i\),然后 \(f_jw(l,r)\) 转移到 \(f_i\)?。但是显然将区间扩大不会使价值变小。因此可以直接扣着边界转移,\(f_i=\max_{j<i} f_j w(j+1,i)\),这样是 \(\mathcal{O}(n^2)\) 的。
最大值太大了,怎么办?可以按取对数的方式改成求和 dp,这样也能知道每个 \(i\) 的转移方式,可以记下答案。
形如 \(f_i=\max_{j<i} f_j+w(j+1,i)\),考虑是否有决策单调性,很遗憾并没有呐。那只能分析这个问题的独特性质了。思索前几天的 CF,有没有可能,能转移的 \(w\) 就几个呢?
考虑和固定的两个数,尽量相近的时候乘积最大,那么考虑一个权值为 \(x\) 的值域区间 \([l,r]\),考虑拆开她然后不妨认为 \(x\) 是偶数,那么解一下 \(\left (\frac{x}{2} \right )^2 \ge x\) 就知道 \(x \ge 4\) 时可以拆成两个区间不劣,当然奇数啥的可以细致讨论一下,\(=1\) 的贡献是 \(0\) 也不用考虑,那么只用考虑 \(w=2,3\) 的区间。
这样的区间全部要考虑吗?\(f_i\) 意思是 \([1,i]\) 分若干段,那么她与 \(f_{i-1}\) 相比肯定不会变小,因此 \(f\) 是不降的,所以我们只想要最短的一个。现在变成 DS 问题,再挖掘一些单调性,固定 \(i\) 后 \(w(j,i)\) 随 \(j\) 减小而增大,两个排列上的区间包含关系的话小的就不用要了。故所求即是 \(\max \le 2\) 的最小的 \(j\)。随着 \(i\) 右移 \(j\) 不降,可以双指针,如何判定?扫描值域后,记 \(res_i\) 表示第 \(i\) 个区间对应上了几个数,那么加减一个数对应在排序后的位置区间上是一段区间,可以 SGT。
也可以扫描序列位置,每次加入一个数的时候,只考虑与这个数形成的区间,那么分讨一下值域也可以,需要维护包含当前位置的区间所含有的数的并集,由于区间排序后的单调性更是可以实现的,用 set 维护。这样的区间是 \(O(n)\) 个。据说如果用莫队则能找到 \(O(n\sqrt m+m)\) 个区间。
P8321 『JROI-4』沈阳大街 2
排列计数方法好多啊。这个是转成匹配做的,就是 \(A\) 和 \(B\) 一一匹配,一组权值是 \(\min\) 的乘积。
由于涉及到 \(\min\),把所有数放一起排序,设 \(f_{i,j}\) 表示前 \(i\) 个数有 \(j\) 对匹配的答案。最终所求是 \(f_{2n,n}\),而转移则是先放下这个数不匹配或是和前面的一个数匹配。选匹配的方案数是 \(res\) 种,\(res\) 是前面异色未匹配点的数量,容易根据 \(j\) 算出。匹配则代价需要在此处计算而非在前面,否则同一组代价被拆开就不能保证正确性,因此从大到小排序,匹配的话权值就是当前点的值。做完了。
[ARC205B] Triangle Toggle
操作无法描述或简化(可以改成任意大小的环取反),尝试寻找不变量。发现每次操作后每个点的黑边奇偶性不变。
如果无限制,答案是 \(N(N-1)/2\),每个点都出 \(N-1\) 条边,但是有奇偶性限制后,如果 \(N-1\) 和初始时这个点黑边奇偶性不同就不能有。由于度数总和是偶数,所以不合法的点出边数 \(K\) 最终也是偶数,减去 \(K/2\) 即可。
猜测上界可以达到,事实上确实可以。(存疑)如果度数奇偶性全相同,可以按白边建图那么度数全是偶数有欧拉回路,也就是若干组环,都可以取反成全黑。
[ARC205E] Subset Product Problem
考虑折半,也就是将一个 \(x\) 拆成前 \(10\) 位和后 \(10\) 位。对于插入 \(a_i\),将其贡献到前 \(10\) 位的超集中,后 \(10\) 位不变,查询则统计后 \(10\) 位的子集,前 \(10\) 位不变。
具体来说,\(f_S\) 表示 \(S\) 的贡献,插入 \(S\),对于 \(S'\) 满足 \(S'\) 前 \(10\) 位是 \(S\) 的超集且后 \(10\) 位与 \(S\) 相等的得到贡献。那么 \(f_S\) 事实上就是只有前 \(10\) 位是 \(S\) 子集的贡献和。统计答案再枚举子集后就两部分都是子集然后全对了。
P14254 分割(divide)
一个 \(S_i\) 一定是对应一段区间 \([l,r]\),没道理不连续吧。然后,考虑 \(S_1\) 中的最小深度 \(dep_{b_1}\),由于交的限制,她必须在所有 \(S\) 中出现,因此有 \(dep_{b_i} \le dep_{b_1}\),又有不降的性质,所以所有 \(b\) 的深度都相同,也就是不会有子树切开再切开的情况就好做了很多。
那么枚举一个深度,并枚举 \(b_1\),限制是所有其它子树的 \(r\) 都 \(\ge b_1\) 的 \(r\),同时要存在 \(=\),\(S_{k+1}\) 的 \(r\) 是没被选的子树的 \(r\) 最大值。简单分讨 \(=\) 在 \(2 \sim k\) 取到还是 \(k+1\) 取到即可。注意要保证解合法。
P14255 列车(train)
\(1\) 操作是 ban 掉 \(l \le x<y \le r\) 的 \((x,y)\),\(2\) 操作是问 \(x\le l<r \le y\) 的 \(p_y-p_x\) 最小值。
询问怎么做?考虑枚举 \(y\),由于 \(p\) 的单调性,找到最大的 \(x\) 即可。考虑所有覆盖 \(y\) 的 \(1\) 操作 \((l,r)\),他们会使得 \(l \sim y-1\) 的左端点不可用,那么 \(y\) 被 ban 掉的区间就一直是一段后缀。
因此暴力就比较清晰,记 \(L_i\) 表示 \(i\) 左侧第一个可用的点,那么修改就是对于 \(i \in (l,r]\),\(\min(l-1,L_i) \to L_i\),查询则是 \(\min_{i \ge r}\{ p_i-p_{\min(l,L_i)}\}\),处理边界可以令 \(p_0=-\inf\)。
由于出现了 \(\min\),我们想要二分,尝试 check \(L\) 是否有单调性,初始时 \(L\) 单调的,同时一直有 \(L_i<i\),归纳证明,那么修改 \(<l-1\) 的不变,大于 \(l-1\) 的改为 \(l-1\),这是变小了,因此后部单调性一直满足,而对前面的最大值 \(L_{l-1}<l-1\),故左侧也仍有单调性。
那么写一个维护 \(L\) 的线段树和维护 \(p_i-p_{L_i}\) 的线段树即可。

浙公网安备 33010602011771号