Loading

ABC G题乱刷

ABC G题乱刷

Solved: 82/177

*[ABC212G] Power Pair (Difficulty: 2150)

考虑找到 \(p\) 的原根 \(g\),那么可以把 \(x,y\) 表示为 \(g^a,g^b\)。(注意特判 \(x=y=0\) 的情况)

那么 \(x^n\equiv y\pmod p(1\le x,y<p)\) 就转换为 \(an\equiv b\pmod{p-1}(1\le a,b\le p-1)\)。下文中的 \(p\) 均为减一后的结果。

考虑固定 \(a\),那么显然存在循环节。设 \(l\) 为最小循环节长度,那么一定有 \(al\equiv0\pmod p\)。那么可得 \(l=\frac{p}{\gcd(a,p)}\)

那么转换为求

\[\sum_{i=1}^{p}\frac{p}{\gcd(i,p)} \]

考虑枚举 \(\gcd(i,p)=d\),并设 \(f_d\) 表示满足 \(\gcd(i,p)=d\) 的个数。那么有

\[f_d=\frac{p}{d}-\sum_{d|t}f_t \]

由于这里的 \(t,d\) 都要为 \(p\) 的因数,所以这部分是 \(O(d^2(p))\) 的,可以接受。

于是总时间复杂度为 \(O(\sqrt p+d^2(p))\)

[ABC213G] Connectivity 2 (Difficulty: 2663)

差点想到了,太可惜了。

观察到答案求的是 \(1\) 的联通块为 \(s\) 的超集的方案数,不好计算。于是考虑设 \(f_s\) 表示 \(1\) 的联通块为 \(s\) 的方案数。最后再求一遍高维后缀和即可。

\(f_s\) 时可以把所有边划分为三类:两端都在集合 \(s\) 内的,两端都在集合 \(s\) 外的,一端在集合 \(s\) 内,一端在集合外的。分别讨论三类边的方案:

  • 两端都在集合 \(s\) 内的,可以设 \(g_s\) 表示这些边的方案数。

  • 两端都在集合 \(s\) 外的,若记 \(cnt_s\) 表示两端都在集合 \(s\) 内边数,那么方案数为 \(2^{cnt_{\overline{s}}}\)

  • 一段端在集合 \(s\) 内,另一端在集合外的,这些边一定不能选,不用考虑。

接下来就只需求出 \(g_s\)。注意到 \(g_s\) 实质上为只考虑 \(s\) 内的边和点,使得整张图联通的边的方案数。

考虑容斥,用总数减去不联通的方案数。而总数显然为 \(2^{cnt_s}\)

若直接枚举其中一个连通块的点集会算重,所以考虑枚举编号最大的点所在的连通块。若记这个点为 \(u\),那么有

\[g_s=2^{cnt_s}-\sum_{u\in s\subset t}g_t\times2^{cnt_{s\oplus t}} \]

最后时间复杂度为 \(O(3^n)\)

*[ABC214G] Three Permutations (Difficulty: 2893)

感觉挺典的,虽然我不会。

注意到限制强于错排,直接考虑容斥。记 \(h_i\) 表示有 \(i\) 个位置不满足条件的方案数,那么有

\[ans=\sum_{i=0}^n(-1)^ih_i(n-i)! \]

然后在看到排列 \(p,q\),于是想到从 \(p_i\)\(q_i\) 连边。这样相当于让边去匹配点,若匹配到两端则不合法。

于是考虑对每个置换环分别 dp。设 \(f_{i,j,0/1}\) 表示考虑环上前 \(i\) 个点,钦定了 \(j\) 个位置非法,且最后一条边是否钦定匹配它的出点。(因为不钦定和匹配入点都对后续 dp 无影响,所以一起考虑)那么转移分讨是否钦定 \(i\)

  • 若不钦定 \(i\)

    \[f_{i,j,0}=f_{i-1,j,0}+f_{i,j,1} \]

  • 若钦定 \(i\)

    \[f_{i,j,0}=f_{i-1,j-1,0} f_{i,j,1}=f_{i-1,j-1,0}+f_{i-1,j-1,1} \]

因为构成了一个环,所以可以钦定第一条边的状态跑两边 dp。注意特判长为 \(1\) 的环。

最后在用背包把每个环的答案拼起来即可。

[ABC215G] Colorful Candies 2 (Difficulty: 2276)

首先可以对颜色离散化。

\(x_i\) 表示第 \(i\) 中颜色是否出现,那么有

\[ans=E(\sum_{i=1}^mx_i)=\sum_{i=1}^mE(x_i) \]

又因为第 \(i\) 中颜色出现的方案数可以用总数减去不出现的方案数,所以有

\[ans=\sum_{i=1}^m\frac{\binom{k}{i}-\binom{n-cnt_i}{k}}{\binom{n}{k}} \]

其中 \(cnt_i\) 表示第 \(i\) 中颜色出现的次数。

暴力计算是 \(O(n^2)\) 的,不能通过。

根据套路,把 \(cnt_i\) 相同的颜色一起做,这样就是只会做 \(O(\sqrt n)\) 次。

最终时间复杂度为 \(O(n\sqrt n)\)

[ABC216G] 01Sequence (Difficulty: 1963)

差分约束水题。

\(d_i\) 表示 \(1\)\(i\)\(1\) 的个数,然后按题目要求建边跑差分约束。

但这样会有负权边,且用 spfa 会 TLE。所以考虑更改状态为 \(0\) 的个数,这样就只有正权边了。

[ABC217G] Groups (Difficulty: 2047)

想复杂了,悲。

直接设 \(f_{i,j}\) 表示把前 \(i\) 个数分成 \(j\) 组的方案数,那么类似于斯特林数分讨:

  • 若新开一个组,那么从 \(f_{i-1,j-1}\) 转移过来。

  • 若加入之前的组,因为和它同余的都不在同一组,所以它能放在 \(j-\lfloor\frac{i-1}{m}\rfloor\) 个组中,作为系数与 \(f_{i-1,j}\) 相乘转移过来。

[ABC218G] Game on Tree 2 (Difficulty: 2217)

易得两人走的路径为一条从根到叶子的路径。

可以发现博弈论是假的。对于一个点,若其深度为奇数,则是先手操作,否则是后手操作。

若能对每个叶子求出从根到叶子的路径的中位数,则可以直接 DP。

而这个可以用对顶 multiset,平衡树,或线段树来做。

[ABC219G] Propagation (Difficulty: 2287)

考虑根号分治。设阈值 \(B\)

  • 对于 \(deg_u\le B\) 的点,直接暴力修改。

  • 对于 \(deg_u>B\) 的点,显然最多有 \(O(\frac{m}{B})\) 个。可以暴力打懒标记,查询一个点权值时再暴力枚举与之相连的 \(deg>B\) 的点更新。

最后时间复杂度是 \(O(q\sqrt m)\),可以通过。

*[ABC221G] Jumping sequence (Difficulty: 2914)

学到了新 trick。

类似于转切比雪夫距离,将 \((x,y)\) 转换为 \((x+y,x-y)\)。那么每一步有如下变化

  • 上:\((x,y+d_i)\to(x+d_i,y-d_i)\)

  • 下:\((x,y-d_i)\to(x-d_i,y+d_i)\)

  • 左:\((x-d_i,y)\to(x-d_i,y-d_i)\)

  • 右:\((x+d_i,y)\to(x+d_i,y+d_i)\)

发现两维是独立的,可以分别考虑。

于是等价于解决如下问题:

选择 \(o_i\in\{-1,1\},\sum_{i=1}^no_id_i=L\)

考虑给两边同时加上 \(\sum d_i\) 后再除以 \(2\),得到

选择 \(o_i\in\{0,1\},\sum_{i=1}^no_id_i=\frac{L+\sum d_i}{2}\)

这可以直接背包,再用 bitset 优化。时间复杂度 \(O(\frac{n\sum d_i}{w})\)

[ABC223G] Vertex Deletion (Difficulty: 2351)

直接换根 DP 求树上最大匹配即可。

只不过有点粪。

[ABC224G] Roll or Increment (Difficulty: 2374)

可以发现一定是先用若干次操作二,再用操作一。并且操作二一定是不断操作直至变到区间 \([p,t]\) 内,其中 \(p\) 是未知的。

由于操作二得到所有数的概率是相同的,所以可以直接算出操作一的期望次数。而操作二的期望次数可以解方程。若记其为 \(x\),则有

\[x=1+\frac{t-p+1}{n}x \]

解得

\[x=\frac{n}{t-p+1} \]

继续观察可以发现,操作一的期望次数单调递减,而操作二的期望次数单调递增。所以总和是凸的,可以三分极值。

[ABC225G] X (Difficulty: 2566)

注意到奇怪的限制和数据范围,直接考虑网络流。

容易发现这是一个类似于文理分科的问题。

设划到点集 \(S\) 内为选,划到点集 \(T\) 内为不选。初始时令所有点都被选上。

若一个点不选,会减少 \(a_{i,j}\) 的贡献,所以从 \(s\) 连一条流量为 \(a_{i,j}\) 的边。

若一个点选,会用 \(2c\) 的代价打 X,所以连向 \(t\) 一条流量为 \(2c\) 的边。

若一个点和其斜方向的点同时选,可以节约 \(c\) 的代价。类似于文理分科建边即可。

[ABC226G] The baggage (Difficulty: 2373)

易得浪费的越少越优,所以可以先令负重能力为 \(i\) 的人搬重为 \(i\) 的物品,这样一定不劣。

然后从大到小考虑每一个物品。易得让负重能力强的人去搬一定不劣,于是直接模拟搬即可。

*[ABC227G] Divisors of Binomial Coefficient (Difficulty: 2207)

因为

\[\binom{n}{k}=\dfrac{\prod_{i=n-k+1}^ni}{\prod_{i=1}^ki} \]

所以只需分别求出 \(\prod_{i=n-k+1}^ni\)\(\prod_{i=1}^ki\) 中每个因子的出现次数即可。

这可以直接用区间筛 \(O(n\log n)\) 求出,但还是不够优秀。

根据经典结论,大于 \(\sqrt n\) 的素数最多只会出现一次,所以只需在区间筛的过程中顺便除掉,最后判断是否为 \(1\) 即可。

时间复杂度 \(O(\sqrt n\log n)\)

*[ABC228G] Digits on Grid (Difficulty: 2711)

一个 native 的想法是设 \(f_{i,j}\) 表示走 \(i\) 步到达第 \(j\) 行或列的方案数。但很可惜,这样会记重。

注意到 \(r,c\le10\),考虑状压。

考虑设 \(f_{i,S}\) 表示走 \(i\) 步,可能到达的行或列的集合为 \(S\) 的方案数。此时 \(S\) 不同意味着最后一个值不同,所以不会记重。

转移就枚举下一个填什么数,然后走过去即可。能转移到的状态可以预处理出来。

时间复杂度 \(O((2^r+2^c)(rc+nV))\)

[ABC229G] Longest Y (Difficulty: 2121)

一眼二分,然后考虑如何判断。

考虑把所有为 Y 的位置拎出来,并从中枚举一个长为 \(mid\) 的段,计算出将这一段变成连续的最小代价。

直接计算不太方便。根据经典套路,将每个 Y 的出现位置减去它是第几个 Y。所以就可以是变成同一个数的最小代价。

显然直接维护中位数即可。因为是单增的,所以可以直接计算求出。

[ABC230G] GCD Permutation (Difficulty: 2516)

ABC230G GCD Permutation 题解

*[ABC231G] Balls in Boxes (Difficulty: 2606)

考虑把 EGF 写出来

\[\begin{aligned} ans&=\frac{k!}{n^k}[x^k]\prod_{i=1}^n\sum_{j=0}^k(a_i+j)\frac{x^j}{j!}\\ &=\frac{k!}{n^k}[x^k]\prod_{i=1}^n(a_i+x)e^x\\ &=\frac{k!}{n^k}[x^k]e^{nk}\prod_{i=1}^n(a_i+x)\\ \end{aligned} \]

后面的 \(\prod_{i=1}^n(a_i+x)\) 的系数可以 \(O(n^2)\) 暴力卷积求出,设为 \(F(x)\)

所以有

\[ans=\frac{k!}{n^k}\sum_{i=0}^k[x^{k-i}]F(x)\frac{n^i}{i!}\\ \]

因为 \(F(x)\) 次数为 \(n\) ,于是可以更换枚举范围,即

\[ans=\frac{k!}{n^k}\sum_{i=k-n}^k[x^{k-i}]F(x)\frac{n^i}{i!}\\ \]

[ABC233G] Strongest Takahashi (Difficulty: 2438)

如果是一维问题可以直接区间 DP。

即使现在是二维问题,也可以类似地区间 DP。设 \(f_{l,r,l^\prime,r^\prime}\) 表示横坐标在 \([l,r]\),纵坐标在 \([l^\prime,r^\prime]\) 内摧毁的最小代价。转移类似地枚举分割点即可。

[ABC234G] Divide a Sequence (Difficulty: 2306)

挺水的,不知道为什么有 2300。

考虑设 \(f_i\) 表示以 \(i\) 为分割点的价值和,\(n^2\) 的转移是平凡的。

然后考虑优化。由于是求和,可以把 \(\min\)\(\max\) 拆开计算贡献。下文只讲 \(\max\) 的计算。

考虑单调栈的思想,维护出每个后缀 \(\max\) 持续的区间,每次暴力弹栈并更新贡献即可。

[ABC235G] Gardens (Difficulty: 2462)

若没有每个盒子至少放一球的限制,答案显然为 \(\sum_{i=0}^A\binom{n}{i}\times\sum_{i=0}^B\binom{n}{i}\times\sum_{i=0}^C\binom{n}{i}\)

然后考虑容斥,记 \(f_i\) 为至少 \(i\) 个盒子不放球的方案数,那么有

\[\begin{aligned} ans&=\sum_{i=0}^n(-1)^i\binom{n}{i}f_i\\ &=\sum_{i=0}^n(-1^i)\binom{n}{i}\times\sum_{i=0}^A\binom{n-i}{i}\times\sum_{i=0}^B\binom{n-i}{i}\times\sum_{i=0}^C\binom{n-i}{i} \end{aligned} \]

现在问题就变成了求出 \(f(n)=\sum_{i=0}^m\binom{n}{i}\),易得有 \(f(n+1)=2f(n)-\binom{n}{m}\)

[ABC236G] Good Vertices (Difficulty: 2438)

注意到恰好走 \(L\) 条边及 \(L\) 很大,于是想到矩乘。

Solution \(\text{I}\)

考虑二分答案,判断 \(1\) 能否到达每个点 \(i\),这样是 \(O(n^4\log L\log m)\) 的。

由于只需判定,所以可以用 bitset 优化矩乘,做到 \(O(\frac{n^4}{w}\log L\log m)\)

对于每个 \(i\) 都二分太浪费了,于是可以整体二分,做到 \(O(\frac{n^4}{w}\log L)\)。卡卡常可以通过。

Solution \(\text{II}\)

考虑直接 DP。记 \(f_{i,j,k}\) 表示从 \(i\)\(j\) 走恰好 \(k\) 步能到达的最小时间,那么有转移

\[f_{i,j,k}=\min_{(u,j)\in E}\{\max(f_{i,u,k-1},w_{u,j})\} \]

由于 \((\min,\max)\) 表示广义矩乘的条件,所以可以直接矩乘。

时间复杂度 \(O(n^3\log L)\)

[ABC237G] Range Sort Query (Difficulty: 2088)

考虑使用类似于 P2824 的方法。

但这题是求值为 \(x\) 的数的位置,不能二分,只能另辟新径。

考虑把 \(<x,=x,>x\) 的分别记为 \(0,1,2\),排序可以变成区间赋值,这样应该也可以做。

考虑进一步转化,把 \(<x,=x,>x\) 的分别记为 \(0/0,0/1,1/1\)。做两次操作后不同的位置即为答案。

[ABC238G] Cubic? (Difficulty: 2270)

这题做法蛮丰富的。

Solution \(\text{I}\)

很容易想到一个暴力莫队做法,时间复杂度是 \(O(n\sqrt n\omega(V))\) 的,但好像也可以通过?

根据经典结论,\(>\sqrt V\) 的质因子最多只有 \(1\) 个,所以可以对质因子根号分治。对于 \(\le\sqrt V\) 的质因子,直接暴力枚举+前缀和判断;对于 \(>\sqrt V\) 的质因子,按上述方法跑莫队即可。

这样时间复杂度约为 \(O(n(\sqrt n+\sqrt V))\)

Solution \(\text{II}\)

考虑把每个质数都随机映射到 \([0,3)\) 中,那么也是直接暴力枚举+前缀和判断。

这样的正确率大约为 \(\frac{1}{3}\),重复 \(100\) 次后概率已经降到了 \(10^{-18}\) 量级,可以忽略不计。

[ABC239G] Builder Takahashi (Difficulty: 2215)

最小割点板子题。

考虑拆点,把每个点变成 \(u_{in}\)\(u_{out}\)。从 \(u_{in}\)\(u_{out}\)\(c_u\) 的边,表示割掉这个点要付出 \(c_u\) 的代价。对于每条边 \(u\to v\),从 \(u_{out}\)\(v_{in}\) 连流量为 \(+\infty\) 的边,表示不能割掉边。

最小割即为答案。

*[ABC240G] Teleporting Takahashi (Difficulty: 2462)

采用与 ABC221G 一样的 trick。

由于是三维问题,可以先枚举在 \(z\) 轴方向上走了 \(i\) 步,在乘上 \(\binom{n}{i}\) 乘以「走 \(i\) 步走到 \(z\) 的方案shu」。然后就变成了平面问题。

平面问题可以用 ABC221G 的方法,转换为「走 \(n-i\) 步走到 \(x+y\) 的方案数」乘以「走 \(n-i\) 步走到 \(x-y\) 的方案数」。于是现在的问题转变为对下述问题计数:

选择 \(o_i\in\{-1,1\},\sum_{i=1}^mo_i=L\)

类似地得到

选择 \(o_i\in\{0,1\},\sum_{i=1}^mo_i=\frac{L+\sum d_i}{2}\)

所以方案数为 \(\binom{m}{\frac{L+\sum d_i}{2}}\)

*[ABC241G] Round Robin (Difficulty: 2422)

先枚举一个 \(p\),并判断 \(p\) 能否获胜。

那与 \(p\) 的比赛中尚未确定结果的一定是让 \(p\) 获胜更优,所以可以计算出 \(p\) 获胜的场次数。

那么就确定了其他人获胜场次数的上限。若记 \(a_i\) 表示第 \(i\) 个人获胜场次数,那么要求 \(a_i<r\)

而一次比赛就相当于给 \(a_x\) 加一或给 \(a_y\) 加一,这可以用网络流解决。

具体来讲,从每场比赛向 \(x,y\) 连流量为一的边,表示可以将其加一。在从每个人向汇点连流量为 \(r-1\) 的边,表示 \(a_i<r\) 的限制。若最大流为比赛数,说明存在一组方案满足 \(a_i<r\) 的限制,即合法。

[ABC243G] Sqrt (Difficulty: 2032)

水题。记 \(f(x)\) 表示初始时序列只有 \(x\) 时最终序列的方案数,转移显然有

\[f(x)=\sum_{y\le\sqrt x}f(y) \]

用前缀和优化可以做到线性。

因为 \(x^{\frac{1}{4}}\) 很小,所以可以先把此范围内的 \(f\) 值递推出来。然后可以得到

\[\begin{aligned} f(x)&=\sum_{y\le\sqrt x}\sum_{z\le\sqrt y}f(z)\\ &=\sum_{z\le\sqrt[4]{x}}f(z)\sum_{y\le\sqrt x}[z\le\sqrt y]\\ &=\sum_{z\le\sqrt[4]{x}}f(z)(\sqrt x-z^2+1)\\ \end{aligned} \]

直接计算即可。

*[ABC244G] Construct Good Path (Difficulty: 2117)

很好的一道构造题。

猜想只需用到 \(n-1\) 条边,所以在任意一棵生成树上考虑。

考虑递归每个儿子使其子树内除了它都合法。这时如果还需走到它,就从父亲向它走一步后再走回来。

但这样就有一个问题:根节点没有父亲。此时因为根节点的儿子都合法,所以任选一个往下走后再往上在往下即可。

[ABC245G] Foreign Friends (Difficulty: 2270)

又是一道做法丰富的题目。

Solution \(\text{I}\)

若没有颜色的限制,显然直接跑多源最短路即可。

再加上颜色的限制,就只需像求次短路一样再记录一个与最短路的源点颜色不同的次短路,转移是平凡的。

只不过这样代码实现难度有点大。

Solution \(\text{II}\)

考虑二进制分组,对于每个二进制位,让颜色这一位为 \(0\) 的关键点贡献到颜色这一位为 \(1\) 的点;颜色这一位为 \(1\) 的关键点贡献到颜色这一位为 \(0\) 的点。

可以证明这样是不会遗漏的。

虽然时间复杂度会多带一个 \(\log\),但代码几乎就是 Dijkstra 板子。

[ABC246G] Game on Tree 3 (Difficulty: 2313)

先二分答案 \(mid\),然后把 \(\ge mid\) 的设为 \(1\)\(<mid\) 的设为 \(0\),然后判断能否把不走到为 \(0\) 的点。

考虑 DP。设 \(f_u\) 表示要在 \(u\) 子树中不走到为 \(0\) 的点,最小需要先 ban 掉多少个点。(注意这里不考虑子树的根)

转移在合并子树的同时计算一下每个儿子的贡献即可。因为可以在子树的根 ban 掉一个点,所以若 \(f_u>0\),则将其减一。

*[ABC247G] Dream Team (Difficulty: 2159)

糖丸了。

奇怪的限制就考虑网络流。

把每一行看作左部点,每一列看作右部点,那么每个交点就相当于一条从 \(x\) 连向 \(y\) 的边。那么原问题就变成了这样的二分图上的最大权匹配。

至于选出 \(i\) 个点的权值和,即为在图上增广 \(i\) 次后得到的最大费用。

[ABC248G] GCD cost on the tree (Difficulty: 2514)

考虑欧拉反演,求出 \(f_d\) 表示只考虑 \(d\mid a_i\) 的点时任意两点路径长度和,那么有

\[ans=\sum f_d\varphi(d) \]

\(f_d\) 直接进行树形 DP 即可。

[ABC250G] Stonks (Difficulty: 2219)

反悔贪心板子,同 CF865D Buy Low Sell High。

[ABC252G] Pre-Order (Difficulty: 2153)

注意到 \(n\le500\),考虑区间 DP。

\(f_{l,r}\) 表示将区间 \([l,r]\) 作为一棵以 \(l\) 为根的树的前序遍历的方案数,\(g_{l,r}\) 表示将区间 \([l,r]\) 作为森林的前序遍历方案数,转移是平凡的。

[ABC253G] Swap Many Times (Difficulty: 2051)

考虑将每对二元组按第一维“分块”,观察进行一个块内的全部操作的结果。

假设这一块的第一维都为 \(x\),那么操作相当于将 \([x:n]\) 这一段都循环右移一位。

进一步观察可以发现,对第一维为 \([l:r]\) 的块,操作后相当于先将 \([l:n]\) 反转,再将 \([r+1:n]\) 反转。

至于前后的散块,暴力模拟即可。注意特判 \(L,R\) 在同一个块内的情况。

*[ABC255G] Constrained Nim (Difficulty: 2734)

考虑用 SG 定理,那么这题的限制相当于对于每个 \(SG(x)\),不能从 \(SG(x-y)\) 转移过来。

可以发现,除去题目中给定的那些 \(x\),其余的 \(SG\) 函数构成了一些直线。因为值域过大,这些点就不用存储,只需记录每个转折点的值。

然后考虑对于每个限制 \((x,x-y)\) 增量计算。若目前增量到 \(x\),说明 \(SG(<x)\) 是已知的。

于是只需统计每种 \(SG(x-y)\) 的出现次数,就可以从小到大枚举 \(\operatorname{mex}\)。注意要考虑转折点的特殊值的出现情况。

[ABC256G] Black and White Stones (Difficulty: 2250)

\(n,d\) 的范围都很奇怪,没有什么启发性。于是就先考虑一个较为暴力的做法。

先枚举每条边上的白色石子个数,然后考虑一个 DP。设 \(f_{i,0/1}\) 表示考虑到第 \(i\) 条边,第 \(i\) 条边最后一个石子的颜色为白/黑的方案数。转移可以预处理出 \(g_{0/1,0/1}\) 表示已知一条边首尾石子的颜色下这条边的方案数。

暴力实现时 \(O(2^2nd)\) 的,但注意到可以矩乘快速幂优化,做到 \(O(2^3\log n\times d)\)

[ABC259G] Grid Card Game (Difficulty: 2428)

下文中记 \(row_i=\sum_ja_{i,j},col_j=\sum_ia_{i,j}\)

Conclusion: 对于 \(row_i<0\) 的行和 \(col_j<0\) 的列,都不会被选择。

Proof:

  • 若没有选择任何的一列,那么完全可以不选这一行是答案更大。

  • 若选择了某一列,根据题目要求,交叉点的权值一定非负,所以选上这一行的贡献为负。故不会选上。

在观察到 \(n,m\le100\),于是可以想到网络流。

将每一行和每一列拎出来,定义某一行被割到集合 \(S\) 中表示选,某一列被割到集合 \(T\) 中也表示选。

然后就可以建模了:

  • 对于每一行,连接 \((S,i,row_i)\),表示不选要付出的代价。

  • 对于每一列,连接 \((j,T,col_j)\),表示不选要付出的代价。

  • 对于每个点 \((i,j)(a_{i,j}\ge0)\),连接 \((i,j,a_{i,j})\),表示若同时选上第 \(i\) 行和第 \(j\) 列,那么答案会减少 \(a_{i,j}\)

  • 对于每个点 \((i,j)(a_{i,j}<0)\),连接 \((i,j,\infty)\),表示不能同时选上第 \(i\) 行和第 \(j\) 列。

最后答案就是 \(\sum row_i+\sum col_j-\text{maxflow}\)

[ABC260G] Scalene Triangle Area (Difficulty: 2339)

考虑每个 O 的贡献,这相当于给一个直角三角形区间加一。

观察这个直角三角形的性质,两条直角边为别为水平和竖直,斜边斜率为 \(\frac{1}{2}\)

先对每一行做一次差分,然后就变成了给一列和一条斜线加一,再次差分即可。

[ABC263G] Erasing Prime Pairs (Difficulty: 2261)

就差临门一脚了!

\(n\le100\),有不太能 DP。就只能考虑网络流了。

先考虑新建一张图。图上点 \(i\) 向点 \(j\) 连边代表 \(a_i+a_j\) 为质数,这部分建图是平凡的。

考虑建图后的新问题,每个点有点权 \(a_i\),一次操作可以选择一条边的两个端点 \(u,v\),将 \(a_u,a_v\) 减一并令答案加一。求答案的最大值。

若不考虑 \(a_i+a_j=2\) 的情况,那么一条边的两个端点一定是一个奇数,一个偶数。换句话说,该图是一张二分图。此时的建模是平凡的。

\(a_i+a_j=2\) 时就只有 \(a_i=a_j=1\),此时有两种做法:

Solution \(\text{I}\)

由于匹配一个 \(1\) 一定优于匹配两个 \(1\),所以一定可以先跑网络流。但为了防止选择了 \((1,a_i)\) 导致无法选 \((a_i,a_j)\),所以要已选择的 \(1\) 的个数为费用跑最小费用最大流。

最后剩下的 \(1\) 的个数就自己匹配。

Solution \(\text{II}\)

上面的费用很没用,考虑直接跑最大流。

先不加入 \(1\) 跑一次最大流,再加入 \(1\) 跑最大流。这样的结果就可以和上面跑最小费用最大流的结果一样。而后面的部分也是一样的。

[ABC264G] String Fair (Difficulty: )

最短路好题!

注意到 \(\left|T_i\right|\le3\),于是考虑只记录最后两个节点。

可以设计 DP \(f_{i,j}\) 表示最后两个字符分别是 \(i,j\) 时的最大价值,转移就枚举下一个字符。注意特判只有一个字符和空串。

注意到转移路径可以建出一张图,用 Spfa 再上面跑最长路即可。若有正环,说明答案为 \(+\infty\)

最多有 \(\left|\Sigma\right|^2\) 个点,和 \(\left|\Sigma\right|^3\) 条边,所以时间复杂度是 \(\left|\Sigma\right|^5\) 的。

*[ABC266G] Yet Another RGB Sequence (Difficulty: 2045)

又有两种做法

Solution \(\text{I}\)

考虑将 rg 看作 #,那么限制就变成了有 \(R,G,B,k\)r,g,b,#,要求 r 不能再 g 前面。

考虑先放完 g,b,#,方案数为 \(\binom{G+B+k}{k}\times\binom{G+B}{G}\)

然后考虑插入 r,由于不能插入再 g 前面,所以可以把一段 g 都和前面的 b# 看作一个,这样可得方案数为 \(\binom{R+G+k}{R}\)

Solution \(\text{II}\)

考虑二项式反演,钦定选择 \(i\)rg,那么易得方案数为

\[\binom{n-i}{i}\times\binom{n-2\times i}{R-i}\times\binom{n-R-i}{G-i} \]

[ABC267G] Increasing K Times (Difficulty: 2561)

又是差点想到,悲。

排列计数只有两种,按位置转移或者按值转移,这道题显然是按值转移。

从小到大加入每个值,设 \(f_{i,j}\) 表示加入了 \(\le i\) 的数,已经有 \(j\)\(k\) 满足 \(a_k<a_{k+1}\)。转移分讨是否增加 \(j\)

  • 若不增加 \(j\),有 \(3\) 种情况:

    1. 加入在序列头部,有 \(1\) 种方案。

    2. 插在一对满足条件的位置中间,此时与前面的会形成新的一对,这样有 \(j\) 种方案。

    3. 插在相同的数后面,记已经插入了 \(buc_i\) 个值为 \(i\) 的数,那么有 \(buc_i\) 种方案。

    容易发现,上述三种情况是不重不漏的。

  • 若增加 \(j\),就相当于是用总方案数减去上述三种情况的方案数。

[ABC268G] Random Student ID (Difficulty: 2311)

考虑一个串 \(s\) 什么时候字典序会比串 \(t\) 小:

  • \(s\)\(t\) 的前缀,则一定满足。

  • \(t\)\(s\) 的前缀,则一定不满足。

  • 否则就有 \(\frac{1}{2}\) 的概率满足。证明可以找到第一个不同的字符,在排列中一个在另一个前面的概率为 \(\frac{1}{2}\)

若记 \(pre_i\) 表示 \(s_i\) 的前缀串个数,\(suf_i\) 表示 \(s_i\) 的后缀串个数,那么期望排名为

\[1+pre_i+(n-pre_i-suf_i)\times\frac{1}{2} \]

至于 \(pre_i,suf_i\) 可以在 Trie 树上树上差分求。

*[ABC269G] Reversible Cards 2 (Difficulty: 2440)

考虑将一次翻面抽象成加上 \(b_i-a_i\),那么原问题就相当于一个 01 背包。

因为有 \(\sum(b_i-a_i)\le\sum(b_i+a_i)=m\),所以最多只有 \(O(\sqrt m)\) 种本质不同的 \(b_i-a_i\)。于是可以转为做多重背包,再用单调队列或二进制分组优化即可。

由于 \(b_i-a_i\) 可以为负,所以本质不同的 \(b_i-a_i\) 实际上约有 \(2\sqrt m\) 个,要用滚动数组优化。

*[ABC271G] Access Counter (Difficulty: 2323)

显然是矩乘优化,于是先考虑一个 \(O(\text{poly}(n))\) 的 DP。

\(f_{i,j}\) 表示第 \(i\) 次登录在时刻 \(j\) 发生的概率,转移就枚举上一次登录发生的时刻。系数是好算的。

然后写成矩阵就做完了,时间复杂度 \(O(24^3\log n)\)

[ABC270G] Sequence in mod P (Difficulty: 2220)

易得

\[\begin{aligned} X_i&=S\times A^i+B\times\sum_{j=0}^{i-1}A_j\\ &=S\times A^i+B\times\frac{A^i-1}{A-1} \end{aligned} \]

所以方程 \(X_i=G\) 可以转换为

\[\begin{aligned} S\times A^i+B\times\frac{A^i-1}{A-1}&=G\\ (A-1)S\times A^i+B\times A^i-B&=G(A-1)\\ A^i&=\frac{G(A-1)+B}{S(A-1)+B} \end{aligned} \]

BSGS 即可。注意特判 \(A=0\lor A=1\) 的边界情况。

*[ABC273G] Row Column Sums 2 (Difficulty: 2521)

看到 DP 状态就会做是什么感觉。

考虑设 \(f_{i,j,k,l}\) 表示还剩下 \(i\) 个和为 \(0\) 的行,\(j\) 个和为 \(1\) 的行,\(k\) 个和为 \(0\) 的列,\(l\) 个和为 \(1\) 的列的方案数,初始化即为 \(f_{\sum[row_i=1],\sum[row_i=2],\sum[col_i=1],\sum[col_i=2]}=1\)

转移直接分讨和为 \(0\) 的行和和为 \(1\) 的行的分配情况即可。

但这样会算重,于是钦定先从小到大分配完所有和为 \(1\) 的行后再分配所有和为 \(0\) 的行。

这样的一个好处就是每次要么只有 \(i\) 变化,要么只有 \(j\) 变化。这样就可以优化到 \(O(n^3)\)

注意到合法的状态一定满足 \(i+2j=k+2l\)。这样就可以在优化掉一个 \(n\),做到 \(O(n^2)\)

*[ABC274G] Security Camera 3

先分享一下我的费用流做法(能不能过未知?)

容易处理出在位置 \(i\) 放四个方向的监控能控制的范围。于是考虑从每个监控向能控制的空地连一条流量为 \(1\) 的边,源点向监控连流量为 \(+\infty\) 的边,空地向汇点连流量为 \(1\) 的边。若最大流为总空地个数就是合法的。

至于最少监控数,考虑用费用来刻画。

upd: 被 fydj 指出漏洞了。

接下来考虑正解。上述做法没有发现一个很重要的性质:每个点的监控不会同时朝左和朝右,也不会同时朝上或朝下。证明显然。

于是可以把横着的空地连通块看作左部点,竖着的空地连通块看作右部点,每个空地看作一条边。那么答案即为这张二分图的最小边覆盖,这就等于二分图最大匹配。直接网络流即可,时间复杂度为 \(O(nm\sqrt{nm})\)

*[ABC276G] Count Sequences (Difficulty: 2278)

考虑对差分数组计数,记 \(d_i=a_i-a_{i-1}\)

先枚举 \(d_1\bmod 3\) 的值,在考虑剩下的 \(d\)。枚举其中有 \(i\)\(2\),那么剩下的都是 \(1\),此时 \(a_n=\sum b_i=s+n+d-1\)

接下来考虑给 \(b_i\) 不断加 \(3\),总共可以加 \(cnt=\lfloor\frac{m-s-n-d+1}{3}\rfloor\) 次。枚举加了 \(j\) 次,根据插板法得到方案数为 \(\binom{n+j-1}{n-1}\)

所以答案为

\[\sum_{s=0}^2\sum_{i=0}^{n-1}\sum_{j=0}^{cnt}\binom{n-1}{i}\binom{n+j-1}{n-1} \]

用前缀和优化可以做到 \(O(n)\)

*[ABC279G] At Most 2 Colors (Difficulty: 2431)

考虑设 \(f_i\) 表示填前 \(i\) 个格子的方案数,分讨转移:

  • \([i-k+1,i-1]\) 只填一种颜色,说明 \(i\) 可以随便填,方案数为 \(c\times f_{i-k+1}\)。从 \(f_{i-k+1}\) 转移是因为确定了 \(a_{i-k+1}\),就确定了其他所有。

  • 若填两种颜色,那么 \(a_i\) 就只有两种取值。方案数可以容斥求出,为 \(2\times(f_{i-1}-f_{i-k+1})\)

至于 \(1\to k\) 的初始化,有 \(f_i=\binom{c}{2}2^i-c(c-2)\),前者表示任选两个颜色填充,后者因为只用一个颜色时每个颜色被算了 \(c-1\) 次,故要减去。

[ABC282G] Similar Permutation (Difficulty: 2412)

排列问题就考虑增量,设 \(f_{i,j,x,y}\) 表示考虑长度为 \(i\) 的排列,相似度为 \(j\),且 \(A_i=x,B_i=y\) 的方案数。

转移考虑把 \(A\) 序列中 \(\ge x\) 的加一,\(B\) 序列中 \(\ge y\) 的加一,显然这不会改变相对顺序。这样转移就是一个二维前缀和,优化后可以做到 \(O(n^4)\)

[ABC284G] Only Once (Difficulty: 2218)

首先可以发现答案的每一行具有对称性,所以只需考虑第一行的答案最后再乘 \(n\) 即可。

容易发现,若从 \(i\to a_i\) 连边,最终会连成一个基环外向树森林。也就是说,一个联通块内只会有一个环。

考虑枚举 \(i\) 表示 \(B_{1,i+1}\) 第一次出现了重复的数,再枚举 \(j\) 表示环长,则答案为

\[\sum_{i=1}^n\sum_{j=1}^iA_n^{i-1}\times n^{n-i}\times(i-j)=\sum_{i=1}^nA_n^{i-1}\times n^{n-i}\times\frac{i(i-1)}{2} \]

*[ABC320G] Slot Strategy 2 (Hard) (Difficulty: 2575)

先枚举最终变成的数字,再二分答案。

注意到一个时刻唯一对应一个卷轴,所以可以建二分图匹配。

暴力建边有 \(O(n^2m)\) 条边,无法通过。

根据 Hall 定理,只有存在完美匹配充要于 \(\left|S\right|\le\left|Nv(T)\right|\)。所以每个点只需要连 \(n\) 条边就能保证存在完美匹配。

*[ABC340G] Leaf Color (Difficulty: 2401)

显然是对枚举每种颜色分别 DP。

假设当前枚举了颜色 \(c\),那么设 \(f_i\) 表示强制 \(i\) 被选上且令 \(i\) 作为连通块最浅点的方案数(注意此时只有一个点的树才会把根视为叶子)。那么转移可以让儿子选或不选,即 \(f_i=\prod_{j\in\operatorname{son}(i)}(f_j+1)\)

但若 \(a_i\not=c\),说明不能只选点 \(i\),所以此时 \(f_i\) 要减一。

然后考虑如何计算答案。

对于 \(a_i=c\) 的点,可以直接让答案加上 \(f_i\)

否则,\(i\) 也不能只选一个儿子,因为这样也会变成叶子。而 \(f_i\) 中又假设它不是叶子,所以不能直接加上 \(f_i\),应加上 \(f_i-\sum_{j\in\operatorname{son}(i)}f_j\)

*[ABC373G] No Cross Matching (Difficulty: 2377)

若一种方案存在两条路径交叉,那么交换后还能使得距离变短。

所以距离最短的方案就是没有交叉的方案。直接调整法即可。

*[ABC383G] Bar Cover (Difficulty: 3026)

考虑记 \(s_i=\sum_{j=i}^{i+k-1}a_i\),那么问题转变为选择一些 \(s_i\),要求相邻的之间间隔了至少 \(k-1\) 个位置。

考虑分治,设 \(f_{u,i,j}\) 表示考虑到分治树上的点 \(u\),左边钦定有至少 \(i\) 个空位,右边钦定有至少 \(j\) 个空位是构成的凸函数,可以用 vector<ll> 存储。那么转移有两种情况:

  • 整个左儿子不选或者整个右儿子不选,直接加入空位即可。

  • 枚举左儿子右边有 \(t\) 个不选,那么即为和 \(f_{ls,i,t}*f_{rs,k-t-1,j}\)\(\max\)。其中 \(*\) 代表 \((max,+)\) 卷积。

直接实现是 \(O(n^2k^3\log n)\) 的。

因为 \(f_{u,i,j}\) 是上凸的,所以可以用闵可夫斯基和优化 \((max,+)\) 卷积,可以做到 \(O(nk^3\log n)\)

注意到 \(f_{u,i,j}\) 只有 \(O(\frac{n}{k})\) 个点值,所以闵可夫斯基和实际上是 \(O(nk^2\log n)\) 的,瓶颈其实在分治树。

若区间长度 \(\le k\),就只能从中选择一个数。将其作为边界条件之后就是 \(O(nk^2\log n)\) 的了。

posted @ 2025-02-07 22:17  LIUIR  阅读(26)  评论(1)    收藏  举报