Loading

AT 杂题选做

ABC363F (Difficulty: 1913)

若记 \(\text{rev}(x)\) 为对 \(x\) 的十进制倒转得到的数,那么答案有三种情况:

  • \(N\)
  • \(x\times\text{rev}(x)\)
  • \(x\times\text{(expression)}\times\text{rev}(x)\)

注意到第二种情况是可以被忽略的,因为 \(x\times1\times\text{rev}(x)=x\times\text{rev}(x)\)

并且我们只需要考虑 \(x\le\sqrt n\) 的情况,因为若 \(x>\sqrt n\),因为要满足 \(x\times\text{rev}(x)\le n\),所以 \(\text{rev}(x)\le\sqrt n\),所以 \(\text{rev}(x)\times\text{(expression)}\times x\) 也满足条件。

所以考虑记 \(f(n)\) 为当 \(N=n\) 时的答案(无解时为空),那么有两种转移:

  • \(n\) 的十进制为回文串且不包含 \(0\),则答案为 \(n\) 的十进制表示。
  • 否则枚举 \(i\in[1,\sqrt n]\),满足 \(i\) 的十进制不包含 \(0\),那么令 \(y=\text{rev}(x)\)。若有 \(n\bmod xy=0\),且 \(f(\frac{n}{xy})\) 不为空,那么答案为 \(x\times f(\frac{n}{xy})\times y\)

用记忆化搜索可以做到 \(O(d^2(n))\)

ABC354F (Difficulty: 1639)

1600 的题目果然比 1900 的要水

考虑先计算出序列的最长递增子序列的长度 \(len\),以及以每个位置开头或结尾的最长递增子序列的长度 \(f_i,g_i\),那么检验一个位置是否合法就只需要判断 \(f_i+g_i-1\)\(len\) 是否相等。

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

ABC353G (Difficulty: 1765)

考虑设 \(f_{i,j}\) 表示第 \(i\) 次操作后走到点 \(j\) 的最大价值,那么转移为

\[f_{i,j}= \begin{cases} f_{i-1,j},&i\not= T_i\\ \max_{k}\{f_{i-1,k}-C\times\left|i-k\right|+w_i\},&i=T_i \end{cases} \]

注意到第一维可以删去,并且每次转移的式子拆开后可以变为

\[f_{T_i}=\max\{\max_{j\le i}\{f_{j}+C\times j\}-C\times i,\max_{j\ge i}\{f_{j}-C\times j\}+C\times i\}+w_i \]

于是可以用线段树维护区间 \(f_i\pm C\times i\) 的最大值,然后转移。

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

ABC339F (Difficulty: 1716)

考虑哈希,计算出 \(a_i\) 在模意义下的值,而之后的计数是容易的。

哈希可以取多个质数,防 hack

ABC359G (Difficulty: 2099)

因为 \(f(i,j)=deep_i+deep_j-2\times deep_{\text{lca}(i,j)}\),所以可以先对于每个 \(i\) 计算出 \(deep_i\) 单独的贡献,这一部分是简单的。

然后考虑计算 \(\sum deep_{\text{lca}(x,y)}\),因为 \(\text{lca}(x,y)\) 的深度即为 \(x\)\(y\) 的公共祖先个数,所以可以转换为对于每个点计算其子树内点权相同的点有多少个,这可以用树上启发式合并求出。

ABC264F (Difficulty: 1878)

考虑设 \(f_{i,j,0/1,0/1}\) 表示走到了位置 \((i,j)\),其中第 \(i\) 行有没有被异或,第 \(j\) 列有没有被异或的方案数。那么转移可以从位置 \((i-1,j)\) 和位置 \((i,j-1)\) 转移过来,并且后两维只会改变一维,所以直接统计即可。

至于转移方程,由于太多了,就不放了。

ARC158C (Difficulty: 1875)

考虑对于每一位分别考虑。

可以先把不进位时的答案先计算一遍,再去统计进位的贡献。而第 \(k\) 位要进位要满足 \(b_i+b_j\ge10^k\),其中 \(b_i,b_j\)\(a_i,a_j\) 的第 \(k\) 位。这可以通过二分统计出方案数。

但要注意,若两个数第 \(k\) 位和为 \(9\),且这一位有进位,这一位就不会再产生贡献,所以要把这种情况减去。

ARC134D (Difficulty: 1998)

考虑先将前 \(n\) 个数的最小字典序子序列求出,记为数组 \(a\),而对应的后 \(n\) 个数即为数组 \(b\)。很显然其他元素就一定不会出现再答案里。

\(mn\) 为满足 \(a_i=a_1\) 的最小的 \(b_1\),分类讨论:

  • \(mn\le a_1\),此时只需要保留 \([a_1,mn]\)
  • 否则继续分类讨论:
    • \(a=[2,2,2,4,5,6],b=[4,3,\cdots]\),那么可以把 \(a\)\(4\) 以后的数去掉,使字典序更小。
    • \(a=[2,2,2,4,5,6],b=[4,7,\cdots]\),那么可以把 \(a\)\(5\) 以后的数去掉,使字典序更小。但注意此时把 \(4\) 以后的数去掉会使字典序更大。

综上,可以算出 \(a\) 种去掉 \(\ge b_1\)\(> b_1\) 后哪个字典序更小,就是答案。

ARC163D Sum of SCC (Difficulty: 2581)

考虑竞赛图缩点的优秀性质。

性质一:竞赛图缩点后任然是竞赛图。

这应该是平凡的。

性质二:竞赛图缩点后的拓扑序唯一

因为是竞赛图,所以入度为 \(0\)\(n-1\) 间每个数的点都恰好有一个。那么每次拓扑都会选择一个入度为 \(0\) 的点,并令其他点入度都减一,这就变成了一个 \(n-1\) 的子问题。

性质三:竞赛图的 SCC 数等于将该图划分为两个集合 \(A,B\)(可以为空)并满足 \(\forall u\in A,v\in B\)\((u,v)\) 这条边的方向为 \(u\to v\) 的方案数减一。

考虑将缩点后的拓扑序即为 \(p_1,\cdots,p_k\),那么对于每一个 \(i\),把 \(p_1\cdots,p_i\) 划入集合 \(A\),剩下的划入集合 \(B\) 一定是一种合法的方案,这样一共有 \(k+1\) 中。

再考虑证明其他方案一定不合法。

若集合 \(A\) 内拓扑序不连续,那么一定存在某个 \(u\in B\),连向了 \(A\) 中的点,这样就不满足条件。集合 \(B\) 内拓扑序不连续也同理。

若把一个 SCC 拆开,肯定也会出现 \(B\) 集合连向 \(A\) 集合的情况,这也不合法。

综上,根据性质三,就只需要计数将其划分为集合 \(A,B\) 的方案数。

\(f_{i,j,k}\) 表示 \(\left|A\right|=i,\left|B\right|=j\)\(u<v\) 的边数为 \(k\) 的方案数,考虑每次加入最大的数,并分讨加入 \(A\)\(B\),并计算对应的方案数。

ARC162E Strange Constraints (Difficulty: 2780)

换一种角度考虑,考虑 DP 每一个数的出现次数。

因为出现次数为 \(i\) 的数的位置 \(j\) 一定满足 \(a_j\ge i\)。于是可以设 \(f_{i,j,k}\) 表示考虑出现次数 \(\ge i\) 的数,这种数一共有 \(j\) 个,且出现次数为 \(k\) 的方案数。

那么转移可以枚举有 \(l\) 个数出现恰好 \(i\) 次,那么对应的系数就为 \(\binom{cnt_i-j}{l}\times\binom{cnt_i-k}{i,\cdots,i}\),其中 \(cnt_i=\sum_{j=1}^n[a_j\ge i]\)。前者表示选出具体的哪 \(l\) 个数,后者表示分配这 \(l\) 的数的位置。

时间复杂度貌似是 \(O(n^4)\) 的,但 \(j,l\) 的上界都只有 \(\lfloor\frac{n}{i}\rfloor\),所以是 \(O(n^3)\) 的。

ARC102F Revenge of BBuBBBlesort! (Difficulty: 3464)

同学们,这是好题啊!

Conclusion: 只有初始时满足 \(p_i=i\) 的点才会作为中心点被操作。

Proof:

  • 若对于一个不满足 \(p_i=i\) 的点操作,那么操作后有 \(p_{i-1}<p_i<p_{i+1}\)。又因为 \(p_i\not=i\),假设 \(p_i<i\),那么说明要操作一次 \(i-1\)。但 \(p_{i-1}<p_i\),所以要用一个 \(>p_i\) 的位置来取代 \(p_{i-1}\)

    但如果成功地有 \(p_{i-1}>p_i\),因为操作了一次 \(i-2\),所以有 \(p_{i-2}<p_{i-1}>p_i\),任然无法操作 \(i-1\)。所以一定非法,\(p_i>i\) 的也是同理。

  • 若一个点在若干次操作后得到了 \(p_i=i\),那么操作了 \(i-1\)\(i+1\)。此时有 \(p_{i-1}<p_i\)\(p_i<p_{i+1}\),无论那种都不能在操作 \(i\)

综上可证。

然后记 \(b_i=[a_i=i]\)。对于相邻且 \(b\) 相等的位置显然无法操作,所以可以把这种位置断开,每个部分都是互不影响的,可以拆分为一个子问题。

下面考虑判断 \(a_{[l,r]}\) 是否合法:

  • \(\exists i\in[l,r],a_i\not\in[l,r]\),那么显然一定非法。

  • 除去 \(a_i=i\) 的位置后,合法等价于最长下降子序列长度 \(\le2\)

    下面考虑证明这一结论:

    • 必要性:若最长下降子序列长度 \(>2\),说明存在位置 \(i,j,k(i<j<k)\) 满足 \(a_i>a_j>a_k\)。若通过一系列存在使得 \(a_i\)\(a_j\) 换位,那么 \(a_k\) 一定无法再和 \(a_j\) 换位。另一边也是同理。

    • 充分性:显然若最长下降子序列长度 \(=1\),那么一定合法。

      若存在位置 \(i,j(i<j)\) 满足 \(a_i>a_j\),那么可以随意操作可操作的点,从而使得最长下降子序列长度变为 \(1\)

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\)

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}\)

AGC022D Shopping (Difficulty: 3866)

妙妙贪心题。

由于摆渡车往返一次花费 \(2L\) 的时间,所以答案一定是 \(2L\) 的倍数。最后再乘上 \(2L\) 即可。

对于一个 \(t_i\),若其 \(>2L\),那么一定会多等一次往返,所以可以先令 \(ans\) 加上 \(\lfloor\frac{t_i}{2L}\rfloor\),并令 \(t_i\) 模上 \(2L\)

先考虑证明答案上界为 \(2L(n+1)\)

考虑按编号逐个经过被一个商场,最后再走一次到达点 \(0\)。一共是 \(n+1\) 次往返。

考虑记 \(l_i=[2x_i\ge t_i],r_i=[2(L-x_i)\ge t_i]\)。说人话就是是否能在 \(0\) 处往返时顺路算上和是否能在 \(L\) 处往返时顺路算上。

若存在 \(i,j\) 满足 \(x_i<x_j\land l_i=l_j=r_i=r_j=1\),说明可以用一次往返同时满足 \(i,j\) 两点,所以答案可以减 \(1\).

再考虑 \((l_i,r_i)=(0,1),(1,0)\) 的情况。根据定义可以得出 \((l_i,r_i)=(0,1)\) 的点满足 \(x_i\le\frac{L}{2}\)\((l_i,r_i)=(1,0)\) 的点满足 \(x_i>\frac{L}{2}\)。所以这两类点之间不可能相互匹配。

于是只有 \((1,1),(0,1)\)\((1,0),(1,1)\) 之间的匹配,直接模拟即可。

最后再考虑 \((1,1)\) 内部的匹配。

若存在 \(t_i=0\) 的点,直接令 \(ans--\) 并舍去。

\(r_n=1\),说明最后一个回到点 \(0\) 的往返可以顺路带上 \(n\),直接令 \(ans--\)。否则就不可能被匹配,直接删掉。

ARC117E Zero-Sum Ranges 2 (Difficulty: 3166)

先考虑如何对一个已知的序列快速求出答案。若记 \(cnt_i\) 表示前缀和为 \(i\) 个位置个数(包括 \(0\)),那么和为 \(0\) 的区间个数为

\[\sum\binom{cnt_i}{2} \]

然后考虑 DP。把前缀和画在图上就是一些类似于山峰的形状,考虑从上往下 DP。因为这样会有一个优美的性质,每次加数只会加在两头和缝隙之间。

于是就可以设计 DP \(f_{d,i,j,k}\) 表示考虑到第 \(d\) 层,一共用了 \(i\) 个点,和为 \(0\) 的区间个数有 \(j\) 个,第 \(d\) 层有 \(k\) 个缝隙的方案数,那么转移就枚举下一层有 \(l\) 个点,那么系数为

\[\binom{x-1}{k+1} \]

证明考虑插板法,把 \(x\) 个求放到 \(k+2\) 个盒子里,不能为空。

但这样是 \(O(n^6)\) 的,可能不能通过。注意到 \(d\) 没什么用,直接不枚举即可。

但这样无法考虑前缀和小于 \(0\) 的位置,这是就需要把两部分拼起来。

此时 \(f_{i,j,k}\) 对应的就是 \(f_{2*n+1-i,m-j,k-1}\),原因画一画图就知道了。

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