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

\[f_{i,k}=\min_{j<i} f_{j,k-1}+(i-j) \max_{k=j+1}^i a_k \]

首先是按 \(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}\) 的线段树即可。

posted @ 2025-10-05 16:37  aCssen  阅读(4)  评论(0)    收藏  举报