atcoder做题记录
AGC032
AGC032C - Three Circuits
view solution
首先每个集合中的点度数都为偶数,因此原图中所有点度数均为偶数。
于是原图必然存在欧拉回路,因此所有点在一个大环上,要将大环拆分为三个小环。
- 有点度数 \(\ge 6\):显然合法。
- 所有点度数 \(\le 2\):显然不合法。
- 一个点度数为 \(4\),其余均为 \(2\):此时只能是两个环套在一个点上,最多只能拆出两个环。
- 两个点度数为 \(4\),其余均为 \(2\):这两个点之间一定连出了两条链,其余点则可能构成另外两条连接这两个点的链或者在这两点上挂两个环。可以发现后者满足而前者不满足。
- 三个以上点度数为 \(4\):此时一定合法。
AGC032D - Rotation Sort
view solution
注意到每个数最多只会移动一次,考虑最终排列中没有移动过的数,它们一定组成一个上升子序列,接下来在考虑其他数是左移还是右移,以第 \(i\) 个数 \(a_i\) 为例:
- 若存在 \(j<i,a_j>a_i\) 且 \(a_j\) 没有移动,则 \(a_i\) 必须左移。
- 若存在 \(j>i,a_j<a_i\) 且 \(a_j\) 没有移动,则 \(a_i\) 必须右移。
- 如果以上两条都不满足,则可以不移动 \(a_i\) 。
- 如果以上两条都满足,就不符合上升子序列的性质了。因此仅凭这两条就可以确定所有数的移动情况了。
那么就可以据此对未移动的数进行 \(dp\) 了,转移枚举上一个未移动的数即可做到 \(\mathcal O(n^2)\)。
AGC032E - Modulo Pairing
view solution
如果 \(M\) 无穷大,那么最优解显然是将所有数从小到大排序后,最小与最大匹配、第二小与第二大匹配、\(\dots\)。
有 \(M\) 的限制后,对于每对匹配的 \((i,j)\),在 \(i,j\) 之间连边,若 \(a_i+a_j<M\) 则连蓝色边,否则连红色边。
接下来就是牛逼结论:一定存在一种最优方案使得存在一个分界点满足,没有连线经过它,且它左侧都是蓝边,右侧都是红边。最终形如:
证明可以通过调整法,对多种情况细致讨论即可。
可以想到暴力枚举分界点,判断左侧是否都是蓝边,右侧是否都是红边并更新答案。为了使 \(M\) 最小,分界点必然越靠左越好,因此左侧蓝边条件一定会被满足,不用考虑,我们只需要满足右侧红边的条件即可,可以直接二分。
AGC032F - One Third
view solution
神仙转化:
将原本的每一刀标记为红色,旋转 \(\frac{\pi}{3}\) 后标记为绿色,再旋转 \(\frac{\pi}{3}\) 后标记为蓝色。取第一刀的红绿线之间的 \(\frac{1}{3}\) 圆弧,则答案就是圆弧上异色线之前角度的最小值。
于是问题转化为在 \([0,1]\) 上随机撒 \(n-1\) 个点并随机染三种颜色,边界上已经有两个异色点,求异色点距离最小值的期望。
显然最小值一定来自于相邻的两个点,将形成的 \(n\) 条线段按距离从小到大排序,枚举答案为第 \(k\) 条线段,则要求前 \(k-1\) 条线段端点都同色,可以得到概率为 \(\frac{1}{3^{k-1}}-\frac{1}{3^k}\),(特别地,若 \(k=n\),则不需要减去 \(\frac{1}{3^k}\))
还要考虑如何计算第 \(k\) 小线段的长度期望,这可以通过积分得到:
于是:
AGC033
AGC033C - Removing Coins
view solution
可以发现每次操作是取一个节点作为根,将以它为根形成的树的叶子删去。
删去所有叶子的操作意味着直径一定减少了,根据选择的点是否为直径的端点可以让直径减 \(1\) 或减 \(2\)。于是问题转化了有一个数,每次可以让它减 \(1\) 或减 \(2\),最终删完者获胜。直接 \(sg\) 函数即可。
AGC033D - Complexity
view solution
注意到最终矩阵的凌乱度是不超过 \(2\log n\) 的,于是可以想到将权值作为状态:记 \(f_{l,r,d,x}\) 表示左、右、下端点分别为 \(l,r,d\),凌乱度为 \(x\) 的矩形上端点的最大值:
横着切:\(f_{l,r,d,x}=f_{l,r,f_{l,r,d,x-1}+1,x-1}\)。
竖着切:\(f_{l,r,d,x}=\max_{mid=l}^{r}(\min(f_{l,mid,d,x},f_{mid+1,r,d,x}))\),随着 \(mid\) 的增加,\(min\) 左侧的值逐渐增加,右侧逐渐减少,可以二分出二者最近的位置进行转移。
复杂度 \(\mathcal O(n^2\log^2n)\)。
AGC033E - Go around a Circles
view solution
不妨假设 \(S[1]=R\),否则可以将所有 RB 互换,答案不变。
如果 \(S\) 中没有 \(B\),则原问题相当于要求环上中不存在相邻的 \(B\)。这是一个经典问题,可以先断环为链,记 \(f_n\) 表示长为 \(n\) 的序列满足不存在相邻的 \(B\) 的方案数。则讨论第 \(n\) 个位置的取法有 \(f_n=f_{n-1}+f_{n-2}\)。最后再将链拼接为环,讨论第 \(n\) 个位置的取法有 \(ans=f_{n-1}+f_{n-3}\)。
否则,除了不存在相邻的 \(B\) 的限制之外,首先必须有至少一个 \(B\) ,其次,考虑环上的 \(B\) 将环分为了若干个 \(R\) 的连续段。再考虑目标串 \(S\) 中的 \(R\) 连续段对环带来的限制:
-
第一个 \(B\) 前的 \(R\) 连续段若长为 \(L\),则我们需要从环上所有点出发走 \(L\) 步后到每个 \(R\) 连续段的端点。因此环上所有 \(R\) 连续段必须长度为奇数且 \(\le L+1\)。若长度为偶数则必然同时存在到两端的距离同为偶数以及同为奇数的点,则两种情况必有一种不合法。
-
对于其余 \(R\) 连续段,若其后还有 \(B\) ,且长度为 \(L\),则我们需要能从每一个环上 \(R\) 连续段端点出发走 \(L\) 步后走到某个端点:
若 \(L\) 为偶数,只需要来回走就可以了。
若 \(L\) 为奇数,则必须要从一端走到另一端,因此任何一个连续段的长度都必须 \(\le L\)。
最终问题变为了选择若干个数使得每个数都是偶数,长度 \(\le\) 某个上界 \(L\),且总和为 \(n\) 的方案数。由于要考虑旋转,答案还要额外乘上第一段的长度。
对此 \(dp\) 即可,使用前缀和优化即可做到 \(\mathcal O(n)\)。
AGC033F - Adding Edges
view solution
考虑一个弱化版的情况:将加入中的 “存在一条简单路径以任意顺序同时包含点 \(a,b,c\)” 修改为要求 \(a,b,c\) 必须按顺序出现。
在这一情况下,对于最终图的一条边 \((u,v)\),必然满足存在一条路径 \(u\to a_1\to a_2\to \dots \to a_k\to v\),满足路径上的每条边都在初始的 \(G\) 中出现且这些点在 \(T\) 的某条路径上按顺序出现。因此对于这个问题,我们只需要从每个点出发 \(dfs\) 一遍求出路径数量即可。
考虑将原问题转化为这个弱化版:
若树的一条路径上一次出现了 \(u,v,w\),且 \((u,v),(u,w)\in G\),则我们可以将 \((u,w)\) 删去,替换为 \((v,w)\),最终形成的图显然不变。对原图不断进行这样的操作直至无法进行,就可以只用上面的弱化版操作得到正确的图了。
考虑如何快速维护这个操作:
依次加入每条边,维护 \(f(x,y)\) 表示 \(T\) 以 \(x\) 为根上 \(y\) 的祖先中与 \(y\) 有连边的最近的祖先。则加入 \((x,y)\) 时按如下方式更新:
-
若 \(f(x,y)=y\):可以直接忽略这条边。
-
若 \(f(x,y)/f(y,x)\) 已经存在,则连边 \((f(x,y),y)\)或者 \((f(y,x),x)\) 即可。
-
若 \(f(x,y),f(y,x)\) 都不存在,可以加入这条边,并更新子树中的 \(f\):
对于以 \(x\) 为根时,\(y\) 子树中某个点 \(w\),若 \(f(x,w)\) 已存在则连边 \((y,f(x,w))\),最后令 \(f(x,w)=y\) 即可。以 \(y\) 为根对 \(x\) 子树做类似的贡献。
AGC034
AGC034C - Tests
view solution
考虑二分答案 \(s\),判断 \(s\) 是否合法。
如果 \(\{a_n\}\) 已经确定,那么我们显然会令 \(a_i\ge b_i\) 的 \(c_i=r_i\),其余 \(c_i=l_i\)。
由于总和确定,可以发现至多只会有一个 \(a_i\) 会取 \(0,x\) 以外的数,于是暴力枚举这个数,然后在其他的数中选择取 \(a_i=x\) 收益最大的几个数贪心令 \(a_i=x\) 即可 \(\mathcal O(n)\) 检验。
AGC034D - Manhattan Max Matching
view solution
不难想到可以暴力连 \(\mathcal O(n^2)\) 条边后跑费用流,但复杂度太高。
考虑曼哈顿距离的性质:\(|x_1-y_1|+|x_2-y_2|=\max(x_1-y_1+x_2-y_2,x_1-y_1+y_2-x_2,y_1-x_1+x_2-y_2,y_1-x_1+y_2-x_2)\),而对于 \(\max\) 中的每一个我们都可以将贡献分到两个点各自身上,就只需要将每个点拆点,再建立一个新点,从所有入点向新点连边,从新点向出点连边。由于原题所求为最大值,所以只需要建立四个新点分别连边跑费用流即可。边数就被优化到了 \(\mathcal O(n)\) 级别。
AGC034E - Complete Compress
view solution
考虑枚举最后的终点 \(rt\),以 \(rt\) 为根建树。
记 \(siz_u=\sum_{v\in subtree(u)}c_vdis(u,v)\),那么每次操作会导致 \(siz_{rt}\) 要么不变要么 \(-2\)。因此如果 \(siz_{rt}\) 为奇数一定无解。除此之外,由于我们只有选择两个来自 \(rt\) 不同子树的节点才能导致 \(siz_{rt}-2\),因此可能会出现 \(rt\) 的各个子树中棋子数不平衡,某一个子树的棋子太多了导致能 \(-2\) 的操作数太少了。
据此,再记 \(mn_u\) 表示对 \(u\) 子树内部进行若干操作能使 \(siz_u\) 最少变为多少。 则有 \(mn_u=\max(\min_{v\in son_u}(mn_v-\sum_{w\in subtree(u),w\notin subtree(v)}c_vdis(u,v)),0)\)。即可做到 \(\mathcal O(n)\) 转移,最后判断 \(mn_{rt}\) 是否 \(=0\) 即可。
总复杂度 \(\mathcal O(n^2)\),也可以换根 \(dp\) 做到 \(\mathcal O(n)\)。
AGC034F - RNG and XOR
view solution
记 \(f_i\) 表示异或出 \(i\) 的期望步数。则有
故 \((f_0,f_1,f_2,\dots )\oplus (p_0,p_1,p_2,\dots)=(f_0+2^n-1,f_1-1,f_2-1,\dots)\)。
于是 \((f_0,f_1,f_2,\dots)\oplus(p_0-1,p_1,p_2,\dots )=(2^n-1,-1,-1,\dots)\)。
直接 \(FWT\) 求逆即可。
AGC035
AGC035C - Skolem XOR Treee
view solution
当 \(popcount(n)=1\) 时,显然无法满足 \(n\) 与 \(n'\) 这两个点的条件,可以先判掉。
否则,由于当 \(x\) 为奇数时 \(x\oplus x+1=1\),一个自然的想法是将 \(2\sim n\) 分为若干对:\((2,3),(4,5),\dots\)。以 \(1\) 为根,对于每一对 \((i,i+1)\) 都连边 \((1,i),(i,i+1),(1,(i+1)'),((i+1)',i')\),这样就同时满足了 \(i\) 与 \(i+1\) 的条件。
这一构造有两个问题需要处理:
- \(1\) 与 \(1'\) 如何解决:由于树上存在若干条链 \(1\to i\to i+1\),直接将 \(1'\) 接在其中任意一条之后即可。
- 当 \(n\) 为偶数时 \(n\) 无法分到任意一组里:取 \(x=lowbit(n)\),连边 \(n\to x\to 1\to (n-x+1)'\to n'\) 即可。
AGC035D - Add and Remove
view solution
可以发现最终剩余的一定是第 \(1\) 张与第 \(n\) 张。考虑区间 \(dp\),对于某个区间 \([l,r]\) 假设 \(l-1,r+1\) 的删除时间都在 \([l,r]\) 中所有数的删除时间之后,因此以某种顺序删掉区间内的数会导致 \(a_{l-1}\) 与 \(a_{r+1}\) 增加某些值,进而对答案造成贡献。
据此,设状态 \(f_{l,r,fl,fr}\) 表示考虑区间 \([l,r]\), \(l-1,r+1\) 的删除时间都在 \([l,r]\) 中所有数的删除时间之后,\(a_{l-1}\) 每增加 \(1\) 会导致 \(ans\) 增加 \(fl\),\(a_{r+1}\) 每增加 \(1\) 会导致 \(ans\) 增加 \(fr\) 时区间 \([l,r]\) 的贡献的最小值。
于是转移枚举区间内最后一个被删除的数:
考虑这样做的复杂度,可以发现 \([fl,fr]\) 的所有可能值构成一个深度为 \(n\) 的二叉树,因此状态数是 \(\mathcal O(2^nn^2)\) 的,可以通过本题。
AGC035E -Develop
view solution
考虑从 \(x\) 向 \(x+2,x+k\) 连边,连边 \((u,v)\) 表示如果 \(u,v\) 都要被删除,则 \(u\) 必须在 \(v\) 之间被删去。因此一个删除集合合法的充要条件就是点集之间不存在环。根据环的具体情况,按 \(k\) 的奇偶性分类:
-
\(k\) 为偶数:则环只能形如 \(a\to a-2\to a-4\to \dots \to a-k\to a\),因此可以奇偶性不同的数字分别讨论,每一类数字组成一条链,要求不能选择链上连续 \(k/2+1\) 个点,直接 \(dp\) 即可复杂度 \(\mathcal O(n^2)\)。
-
\(k\) 为奇数:
可以发现每个环一定形如 \(a\to a-2\to \dots \to b-k\to b\to b-2\to \dots \to a-k\to a\)。考虑将图画成以下形式:
这相当于在考虑到点 \(a\) 时存在一条从 \(a\) 出发向上向右再向上的路径满足经过的点数 \(>k+1\) 且向上的部分点数 \(\le k+1\)。
于是对此可以从上到下 \(dp\),记 \(f_{i,j,k}\) 表示 \(dp\) 到第 \(i\) 层,目前最长的向上向右再向上的路径长为 \(j\),且第 \(i\) 层的偶数的点向上连续 \(k\) 个点都被选中了,即可 \(\mathcal O(1)\) 转移。复杂度 \(\mathcal O(n^2k)\)。
AGC035F - Two Histograms
view solution
本质不同的操作序列是好求的,但不同的操作序列可以对应同一种网格。对此,有一个绝妙的结论:
如果存在 \((i,j)\) 使得 \(k_i=j-1,l_j=i\) ,那么将它换成 \(k_i=j,l_j=i-1\) 显然可以得到相同的网格(大概形如一个拐角)。
可以证明,所以不存在 \(k_i=j-1,l_j=i\) 的操作序列对应的网格互不相同。
显然这样的拐角每行每列都只会有一个,可以对此进行二项式反演,记 \(f_i\) 表示钦定了 \(i\) 个拐角必须出现后的操作序列数,则有:
再记 \(g_i\) 为恰好有 \(i\) 个拐角的操作序列数,则:
故:
AGC036
AGC036B - Do Not Duplicate
view solution
记录 $nxt_i$ 表示 $i$ 之后第一个数字与 $i$ 相同的位置。那么在 $s$ 为空时加入了 $i$,那么走到 $nxt_i$ 时栈会被清空。可以将 $i$ 向 $nxt_i\bmod n$ 连边,最终会形成若干环。在环上走到最后一次栈清空的位置,此后要加入的数不超过 $n$ 个,可以暴力处理。AGC036C - GP 2
view solution
考虑判断一个最终序列是否合法。以下这几个条件是显然需要满足的:
在满足这些条件后,不难用 \(Hall\) 定理证明可以找到 \(+1\) 与 \(+2\) 的完美匹配,因此这些条件就是充要条件了。
注意到不满足条件 \(2\) 的最多只有一个 \(i\)。考虑先不管条件 \(2\) 计算方案数,此时可以枚举奇数 \(a_i\) 的个数然后用组合数计算。然后再暴力枚举不满足条件 \(2\) 的 \(i\),此时就不需要考虑条件 \(3\) 了,可以再用一个组合数计算方案数。
AGC036D -Negative Cycle
view solution
不存在负环等价于该图不存在一组合法的差分约束的解。于是问题转化为找一组差分约束的解使得需要删掉的边的代价之和最小。
设差分约束的解为 \(x_0,x_1,\dots,x_{n-1}\),那么图中初始的 \(n-1\) 条边意味着 \(x_i\ge x_{i+1}\),考虑差分,设 \(q_i=x_i-x_{i+1}\),因此 \(q_i\ge 0\)。
- 边 \(i\rightarrow j(i<j)\):\(x_i-1\ge x_j\),即 \(\sum_{k=i}^{j-1}q_k\ge 1\)。
- 边 \(i\rightarrow j(i>j)\):\(x_i+1\ge x_j\),即 \(\sum_{k=j}^{i-1}q_k\le 1\)。
因此如果 \(q\) 的某一个区间 \([l,r]\) 满足区间和为 \(0\),则需要删去边 \(l\to r+1\);若区间和 \(\ge 2\),则需要删去边 \(r+1\rightarrow l\)。由于代价均为正,因此我们一定不会选择让某一个 \(q_i\ge 2\),\(q_i\) 只会取 \(\{0,1\}\),且对上两个条件我们只需要考虑相邻的两个 \(1\) 的位置。设 \(dp\) 状态 \(f_{i,j,k}\) 表示填了前 \(i\) 个 \(q\),上一个 \(1\) 的位置是 \(j\) ,倒数第 \(2\) 个 \(1\) 的位置是 \(k\) 的最小代价。转移代价可以用二维前缀和优化 \(\mathcal O(1)\) 求出。复杂度 \(\mathcal O(n^3)\)。
AGC036E - ABC String
view solution
首先可以将相邻的相同字母合并到一起。记 \(c_a,c_b,c_c\) 分别为 \(A,B,C\) 的出现次数,不妨假设 \(c_a\le c_b\le c_c\),那么答案的上界就是 \(3c_a\)。为了接近这个上界,取出原串中所有的 \(A\) 将原串分为了若干个部分,每一部分都是 \(BC\) 交替的串。首先考虑删去一些 \(C\) 使得 \(c_b=c_c\),为了满足上界,我们尽量保留所有的 \(a\),优先只删边界上的 \(C\) 或者中间长度 \(\ge 2\) 的部分的边界上的 \(C\)。如果删完还是不够,就只能将只含一个 \(C\) 的部分连带这它旁边的 \(A\) 一起删掉了,显然这样做一定能使得 \(c_b=c_c\)。
满足 \(c_b=c_c\) 后,不断删去连续的 \(BC/CB\) 直到 \(c_a=c_b=c_c\) 即可。
AGC036F - Square Constraints
给定 \(n\) ,问有多少个排列 \(0\sim 2n-1\) 的排列 \(\{p_i\}\) 满足:
对于 \(\forall i\in[0,2n-1]\),有 \(n^2\le i^2+p_i^2\le (2n)^2\)。\(n\le 250\)。
view solution
真神仙题,核心转化:
- 问题中不合法以及合法的部分都是一段前缀,因此可以想到容斥。
设 \(l_i=\lceil n^2-i^2 \rceil-1,r_i=\lfloor (2n)^2-i^2\rfloor\)。可以想到经典容斥,枚举某 \(k\) 个数,强制令它们 \(\le l_i\),其他数只需要满足 \(\le r_i\),求出此时的答案。
每个数只有上限没有下限时,可以将所有数的上限从小到大排序,那么所有前面的数的选择都会导致后面的属选择空间 \(-1\),设第 \(i\) 个数的上限为 \(a_i\),不难得到答案就是 \(\prod_{i=0}^{2n-1}(a_i-i+1)\)。
但直接 \(2^n\) 枚举复杂度太高,考虑用 \(dp\) 维护这个排序求答案过程。由于原问题中只有 \([0,n)\) 中的数是有下界的,因此可以先对 \([0,n)\) 中的数以 \(l_i\) 为关键字,对 \([n,2n)\) 中的数以 \(r_i\) 为关键字从小到大排序。记 \(f_{i,j}\) 表示考虑了前 \(i\) 个数,有 \(j\) 个数被钦定 \(\le l_i\) 时的选择方案数。
考虑加入第 \(i\) 个数时的转移:
-
如果 \(i\in[n,2n)\),那么此时它的可选空间为 \(r_i+1\),但还要排除已选择的数中上界 \(\le r_i\) 的:
- 已经被考虑过的数中上界选择 \(l\) 的,此时由于之前的排序,它们的上界一定 \(\le r_i\),一定占用了 \(j\) 个可选位置。
- 已经被考虑过的数中没有下界的(也就是 \(\in[n,2n)\) 的),同样由于排序,它们一定会占用可选位置,可以用一个计数器 \(ct\) 来记录这部分数的数量。
- 已经被考虑过的数中,有下界但上界选择 \(r\) 的,那么对方上界一定比 \(r_i\) 大,不会占用可选位置。
因此有转移 \(f_{i,j}\gets f_{i-1,j}(r_i+1-j-ct)\)。
-
如果 \(i\in [0,n)\),并且上界为 \(l\),那么分析过程与上一个几乎完全一致,有转移 \(f_{i,j}\gets f_{i-1,j-1}(l_i+1-(j-1)-ct)\)。
-
如果 \(i\le [0,n)\) ,并且上界为 \(r\),那么一开始有 \(r_i+1\) 个可选位置,上限比它小的,就是所有上界选择 \(l\) 的数、所有 \(\in[n,2n)\) 的数,以及在它之前被考虑的 \(\in[0,n)\) 且上界为 \(r\) 的数,考虑在循环外先枚举上界选择 \(l\) 的数数量 \(k\),有转移 \(f_{i,j}\gets f_{i-1,j}(r_i+1-k-n-(i-j-ct))\) 。
于是进行一次 \(dp\) 的复杂度是 \(\mathcal O(n^2)\) 的,总复杂度即为 \(\mathcal O(n^3)\),可以通过此题。
注意排序的时候,如果上界相当,优先将 \(\in[0,n)\) 的排在 \(\in[n,2n)\) 的数前面,因为前者如果选择上界为 \(r\) 则会受后者影响。
AGC037
AGC037B - RGB Balls
view solution
可以发现直接将每种颜色的第 \(i\) 个球分给第 \(i\) 个人就可以取到最优解。在这个方案中将每个人的第 \(i\) 个球标上 \(i\),能取到最优解的方案中,标 \(1\) 的必须仍然是某人的第一个球,标 \(3\) 的必须仍是某人的第三个球。\(\mathcal O(n)\) 正反扫两遍分别计算标 \(2\) 的球与 \(1,3\) 的匹配方法即可。
AGC037C - Numbers on a Circle
view solution
倒过来考虑从 \(B_i\) 出发,每次让 \(B_i-=B_{i-1}-B_{i+1}\)。考虑任意一个位置 \(i\) 满足 \(B_i>B_{i-1}+B_{i+1}\),那么如果对 \(B_i\) 有操作,那么对 \(B_i\) 的操作一定在对 \(B_{i-1},B_{i+1}\) 的操作之前,因此可以看作这次操作是最后一步进行的,直接让 \(B_i-=B_{i-1}+B_{i+1}\) 即可。如果减到了 \(B_i<A_i\) 则直接判断无解即可。
为了保证复杂度,可以用堆维护所有的 \(B_i\),每次取出全局最大值 \(B_i\),直接执行多次操作直到 \(B_i<B_{i-1}+B_{i+1}\) 或 \(B_i\le A_i\)为止。这样复杂度就是 \(\mathcal O(n\log n\log W)\)。
AGC037D - Sorting a Grid
view solution
考虑从后往前推。
- 从 \(D\) 推到 \(C\):只要在 \(C\) 中每个元素的行正确,\(C\) 就是合法的。
- 从 \(C\) 推到 \(B\):将 \(D\) 中同一行的元素染上同一个颜色,只要 \(B\) 中每一列都恰好含有每个颜色的元素各一个,\(B\) 就是合法的。
- 从 \(B\) 推到 \(A\):考虑将行作为左部点,颜色作为右部点,每行向 \(A\) 中该行出现的颜色连边。那么这张图的一个完美匹配就是 \(B\) 中的一列,一个自然的写法是直接做 \(m\) 次二分图匹配,每次匹配完将匹配边删掉,就能得到矩阵 \(B\)。
注意到在跑了 \(k\) 次匹配后,每个左部点与右部点的度数均为 \(n-k\),使用 \(hall\) 定理即可证明每次匹配都能找到完美匹配。
AGC037E - Reversing and Concatenating
view solution
考虑 \(s\) 中字典序最小的字母 \(c\),我们显然希望最终得到字符串中开头 \(c\) 的出现次数尽可能多。为了到达这一点,如果 \(k>1\),我们会在将字符串翻转后取出最长的一段满足其末尾的 \(c\) 数量最多,接下来每次操作都可以倍长末尾的 \(c\) 长度,最后一步操作再将这段 \(c\) 放到开头即可。
于是在经过 \(\mathcal O(\log n)\) 次操作后,这段 \(c\) 的长度就会 \(=n\),因此在 \(k>\mathcal O(\log n)\) 时直接输出 \(n\) 个 \(c\) 即可。
否则,在此基础上最小化这段 \(c\) 之后的字符串 \(s'\) 的字典序。注意到从第二步开始每一步都是在初始的串的基础上最后增加一段 \(c\),因此 \(s'\) 就是第一步保留的字符串除去末尾的 \(c\) 后的部分, \(reverse\) 之后的一个前缀。因此只要在第一步选择的时候保留翻转后字典序最小的串,即可同时满足 \(c\) 的数量最多以及剩余部分字典序最小两个要求。
AGC037F - Counting of Subarrays
view solution
在 \(L\) 确定后,考虑如何判断一个序列是否合法:
- 若序列长度为 \(1\),一定合法。
- 否则,记序列中的最小值为 \(x\),取出所有 \(x\) 的连续段,如果连续段的长度 \(len<L\),那么序列一定不合法。否则将这一连续段缩成长度为 \(\lfloor \frac{len}{L}\rfloor\) 的 \(x+1\) 连续段继续进行判定。如此重复直到序列中只剩一种数字且长度 \(\ge L\)。
照这样做我们将每一个合法区间 \([l,r]\) 分到了级别 \(\max_{i=l}^{r} a_i+1\) 级别上。
考虑对原串执行判定的过程中同时计算每个子串是否是好串。在对原串进行合并时对每一段 \(i\) 维护 \(L_i\) 表示有多少个原串的前缀被合并到了以段 \(i\) 为结尾的前缀中,\(R_i\) 表示有多少个原串的后缀被合并到了以段 \(i\) 为开头的前缀中。那么每次在合并段 \(l\sim r\) 时:
- 对于第一种判定,对 \(\forall i\in[l,r]\) 用 \(L_iR_i\) 更新答案。
- 对于第二种判定,对 \(\forall i,j\in [l,r],j-i-1\ge k\),用 \(L_iR_j\) 更新答案。
需要注意的是第一种贡献中的 \(L_iR_i\) 可能有一部分在上一次进行合并时就已经被计算了,需要减去。
于是在合并过程中,动态维护 \(L,R\) 即可,由于将一些段合并后,这些段中元素个数都会除以 \(m\),所以复杂度是正确的。
AGC038
AGC038C - LCMs
给定 \(n\) 个数 \(a_i\),求 \(\sum_{i=1}^{n}\sum_{j=i+1}^{n}\text{lcm}(a_i,a_j)\)。
\(n\le 2\times 10^5,a_i\le 10^6\)。
view solution
莫比乌斯反演模板题。可以调和级数 \(\mathcal O(V\log V)\),其中 \(V=\max(a_i)\),也可以高维卷积优化到 \(\mathcal O(V\log\log V)\)。
AGC038D - Unique Path
给定 \(n,m\) 以及 \(q\) 条限制,询问是否能构造出一个 \(n\) 个点 \(m\) 条边的无重边自环的连通图使得满足所有限制:第 \(i\) 条限制形如 \((u_i,v_i,w_i)\),其中 \(w_i=0/1\):若 \(w_i=0\) 表示要求建出的图中 \(u_i\) 到 \(v_i\) 只有一条简单路径,若 \(w_i=1\) 表示建出的图中 \(u_i\) 到 \(v_i\) 有不止一条简单路径。
\(n,q\le 10^5,m\le \frac{n(n-1)}{2}\)。
view solution
可以发现 $w_i=0$ 限制是具有传递性的:即如果 $a$ 到 $b$ 只有一条简单路径,$b$ 到 $c$ 也只有一条简单路径,那么 $a$ 到 $c$ 只有一条简单路径。据此可以将 \(w_i=0\) 的限制看作边,合并得到若干个连通块,那么每个连通块的在原图中的实际连边情况一定是一棵虚树,之所以是虚树是因为可能两点的边上还会有其他点,但为了尽量满足 \(m\) 条边以及 \(w_i=1\) 的限制,出现这样的情况一定不优。所以可以直接认为该连通块内部组成了一棵树。
接下来考虑在这些连通块之间连边,为了满足连通块内部任意两个点之间只有唯一简单路径的限制,每个连通块最多只能有一个点与其他连通块有连边,可以称为代表点。代表点之间可以任意连边,如果没有 \(w_i=1\) 的限制,那么只需要边数能够取到即可,设有 \(k\) 个连通块,则可选的边数区间为 \([n-1,n-k+\frac{k(k-1)}{2}]\)。
对于 \(w_i=1\) 的限制,如果 \(u_i,v_i\) 在同一个连通块中一定无解。否则,若只有两个连通块,那么仅用代表点不可能完成构造。如果有三个以上的连通块,将代表点直接连成一个环,就可以使得任意不在同一连通块的两点之间有超过一条简单路径了,在此基础上可以任意增加边,只需要边数在 \([n,n-k+\frac{k(k-1)}{2}]\) 范围内即可。
AGC038E - Gachapon
有一个随机生成器,能生成 \([1,n]\) 之间的整数,其中生成 \(i\) 的概率为 \(\frac{a_i}{S}\),\(S=\sum_{i=1}^{n}a_i\)。
现在这个生成器不断生成数,直到 \(\forall i\),\(i\) 出现了不小于 \(b_i\) 次时停止生成,问期望下此时生成随机数的次数为多少。
\(a_i,b_i\ge 1,\sum a_i,\sum b_i,n\le 400\)。
view solution
考虑定义 \(w_i\) 表示期望下生成多少次随机数才能使得 \(i\) 出现了不少于 \(b_i\) 次,那么所求即为 \(\max\{w_1,w_2,\dots w_n\}\)。
可以想到 \(\min-\max\) 容斥,将 \(\max(S)\) 视为 \(S\) 集合中所有数的 \(w\) 的最大值,那么有 \(\max(S)=\sum_{T\subset S}(-1)^{|T|-1}\min(T)\)。
现在考虑如何求解 \(\min(T)\),首先 \(T\) 之外的数可以忽略,由于每次随机有 \(\frac{\sum_{i\in T}a_i}{S}\) 的概率随机到 \(T\) 中的数,因此可以认为只在 \(T\) 中的数随机,最后答案乘上 \(\frac{S}{\sum_{i\in T}a_i}\) 即可。
现在的问题相当于每次生成器在 \(T\) 中的数随机,当某一个数 \(i\) 出现了不小于 \(b_i\) 次时停止,询问此时生成随机数的次数的期望。可以套路地将其转化为 \(\sum_{k=0} f_k\) ,其中 \(f_k\) 为执行 \(k\) 次随机后游戏没有结束的概率,可以发现 \(f_k\) 相当于将 \(k\) 个不同的球分配到 \(|T|\) 个盒子中,满足第 \(i\) 个盒子的球数 \(<b_i\)。可以先转化为相同的球,再进行背包 \(dp\),最后乘上多重组合数以及概率 \(\dfrac{\prod_{i} a_i^{d_i}}{(\sum_i a_i)^k}\dfrac{k!}{\sum_i (d_i)!}\),其中 \(d_i\) 为第 \(i\) 个盒子的球数,可以在 \(dp\) 过程中计算。
于是可以将最外层对 \(T\) 的暴力枚举也加入 \(dp\) 中,记 \(f_{i,j,k}\) 表示考虑了前 \(i\) 个数,目前 的 \(T\) 集合中 \(\sum_{x\in T}a_x=j,\sum_{x\in T}b_x=k\) 时的方案系数之和,则有转移:
其中的 \(-1\) 是因为 \(\min-\max\) 容斥的 \((-1)^{|T|-1}\) 系数,因此初始值 \(f_{0,0,0}=-1\)。最终答案即为
最终的复杂度是 \(\mathcal O((\sum_ib_i)^2\sum_i a_i)\) 的。
AGC038F - Two Permutations
给定两个 \(0\sim n-1\) 的排列 \(\{p_0,p_1,\dots,p_{n-1}\},\{q_0,q_1,\dots,q_{n-1}\}\),要求构造两个 \(0\sim n-1\) 的排列 \(\{A_i\},\{B_i\}\),满足 \(A_i=i\) 或者 \(A_i=p_i\) ,以及 \(B_i=i\) 或者 \(B_i=q_i\)。在此基础上最大化 \(A_i\not=B_i\) 的 \(i\) 数量。询问这个最大值。
view solution
考虑求排列 \(p\) 分解为若干个环。对于某一个环,不妨设其上的元素为 \((1,2,\dots ,k)\),可以发现该环对应的 \(A\) 取值只有两种情况:
- \(A_1=1\),那么 \(A_k\) 就只能选择 \(k\) 了,依次类推可得到对于 \(\forall i\in[1,k]\) 都有 \(A_i=i\)。
- \(A_1=p_1=2\),那么 \(A_2\) 就只能选择 \(p_2=3\) 了,以此类推推可以得到对于 \(\forall i\in[1,k]\) 都有 \(A_i=p_i\)。
同理可以将 \(q\) 拆为若干环得到类似的结论。
现在问题相当于对每个环指定是拆成若干自环还是保留原状。考虑如何满足 \(A_i\not=B_i\) 的限制,这一点需要进行分类讨论,不妨设 \(p_i,q_i\) 所在的环分别为 \(C,D\):
- \(p_i=q_i=i\),那么必然有 \(A_i=B_i\),可以忽略。
- \(p_i=i,q_i\not= i\),那么若环 \(D\) 被拆则 \(A_i=B_i\),否则 \(A_i\not=B_i\)。
- \(p_i\not= i,q_i= i\),那么若环 \(C\) 被拆则 \(A_i=B_i\),否则 \(A_i\not=B_i\)。
- \(p_i\not= i,q_i\not=i,p_i=q_i\),那么若环 \(C,D\) 同时被拆或者同时保留则 \(A_i=B_i\),否则 \(A_i\not=B_i\)。
- \(p_i\not= i,q_i\not=i,p_i\not=q_i\),那么只有两个环都被拆时才有 \(A_i=B_i\)。
于是可以建立一个最小割模型,初始令所有 \(A_i\not= B_i\),每断掉一条边相当于令 \(A_i=B_i\)。对 \(p,q\) 的环分别建边,将 \(p\) 中的环与源点相连,\(q\) 中的点与汇点相连可以看作是保留这个环,否则是拆掉这个环。
上述五种情况分别对应:
- 不连边,直接令答案 \(-1\)。
- 连边 \((D,t,1)\)。
- 连边 \((S,C,1)\)。
- 连边 \((C,D,1),(D,C,1)\)。
- 连边 \((D,C,1)\)。
最后跑网络流即可,由于这是一个流量为 \(1\) 的二分图,复杂度是 \(\mathcal O(n\sqrt{n})\) 的。
AGC039
AGC039D - Incenters
在平面中给定\(n\)个位于单位圆上的点,坐标形如\((\cos\frac{2\pi T_i}{L},\sin\frac{2\pi T_i}{L})\),等概率随机地选取其中不同的三个点组成三角形,求三角形的内心(即,内切圆的圆心)的横纵坐标期望。
\(n\le 3000\)。
view solution
没有几何知识,甘拜下风。
核心理论一:将该三角形 \(ABC\) 的三条角平分线作出并延长,交单位圆于 \(D,E,F\) 三点,则三角形 \(ABC\) 的内心为三角形 \(DEF\) 的垂心。证明考虑圆周角。
核心理论二(欧拉线):对于任意三角形 \(ABC\),其外心 \(O\),重心 \(G\),垂心 \(H\) 在同一直线上且 \(|GH|=2|OG|\)。
于是现在我们只需要求所有这样的三角形 \(DEF\) 的外心坐标和与重心坐标和了。前者显然是 \(0\),而对后者注意到重心的横纵坐标均为三个顶点的坐标和的 \(\frac{1}{3}\),于是可以枚举点 \(A,B\),用它们的弧中点的坐标来更新答案,即可做到 \(\mathcal O(n^2)\)。
AGC039E - Pairing Points
在一个圆上有 \(2n\) 个点,其中一些点对有连线,且保证不存在三线共点。现在要求选择 \(n\) 条线保留下来使得每个点恰好连一条线,并且将这 \(n\) 条线画出来后构成一棵树。
\(n\le 20\)。
view solution
首先令 \(n\gets 2n\)。考虑枚举 \(1\) 号点与哪个点相连,不妨假设为 \(i\) 号点,然后就能将环划分为两部分,两部分之间至少要有一条边相连,连了这条边之后就只需要两边内部连通,整个图就连通了。
于是可以 \(dp\),记 \(f_{l,k,r}\) 表示仅考虑区间 \([l,r]\) 中的点,其中的点 \(k\) 向区间外部连了一条边,内部连边使得区间 \([l,r]\) 连通的方案数。
那么 \(k\) 连出的这条边将区间划分为 \([l,k-1]\) 与 \([k+1,r]\) 两部分,两部分之间可能连了若干条边 \((a_1,b_1),(a_2,b_2),\dots,(a_t,b_t)\),不妨假设 \(a_1< a_2< \dots <a_t\),那么为了不形成环必然也有 \(b_1<b_2<\dots<b_t\)。考虑枚举 \(x=a_1,y=a_1\)。那么此时 \((x,k)\) 中的点连出的边,为了不形成环,一定会存在一个分界点 \(p\) 满足 \(p\) 之前(包括 \(p\))的点连出的边都与边 \((x,y)\) 相连,\(p\) 之后的点都与 \(k\) 连出的边相连。同理在 \((k,y)\) 中也有一个分界点 \(q\)。因此就得到了 \([l,p],[p+1,q-1],[q,r]\) 两个子问题。
故有转移 \(f_{l,k,r}\gets f_{l,x,p}+f_{p+1,k,q-1}+f_{q,y,r}(a_{x,y}=1)\)。
其中 \(a_{i,j}\) 表示点 \(i,j\) 是否有边。直接暴力枚举 \(l,k,r,x,y,p,q\) 是 \(\mathcal O(n^7)\) 的,但由于有 \(\frac{1}{7!}\) 的常数已经可以通过了,但也可以继续优化。
假设正在转移 \([l,r]\),可以发现 \(x\) 仅在 \(f_{l,x,p}\) 以及 \(a_{x,y}=1\) 处出现,可以先枚举 \(p,y\),求出 \(mx1_{p,y}=\max_x([a_{x,y}=1]f_{l,x,p})\)。接下来枚举 \(p,q\) 求出 \(mx2_{p,q}=\max_{y}(mx1_{p,y}+f_{q,y,r})\)。最后再枚举 \(p,k\) ,有转移 \(f_{l,k,r}\gets \max_{q}(mx2_{p,q}+f_{p+1,k,q-1})\)。这样一来复杂度就优化到 \(\mathcal O(n^5)\) 了,还有 \(\frac{1}{120}\) 的常数。
AGC039F - Min Product Sum
一个大小为 \(n\times m\) 的矩阵,矩阵中每个数在 \([1,k]\) 中任意取值。对于某一个矩阵,定义 \(f(x,y)\) 表示第 \(x\) 行与第 \(y\) 列的所有数的最小值,然后定义该矩阵的权值为 \(\prod_{i=1}^{n}\prod_{j=1}^{m}f(i,j)\)。为所有 \(k^{nm}\) 种矩阵的权值之和。
\(n,m,k\le 100\)。时限 \(6s\)。
view solution
貌似是非常套路的题目?
直接最小值不好处理,可以想到将 \(f(x,y)\) 改为 \(\sum_{i=1}^{k}[f(x,y)\ge i]\)。
于是有:
考虑记 \(r_x=\max_{i}a_{x,i},c_y=\max_{i}a_{i,y}\),改为枚举 \(r,c\):
其中 \(g(r,c)\) 表示填写矩阵 \(a\) 使得,\(\forall x\in[1,n],y\in[1,m],\max_{i}a_{x,i}=r_x,\max_ia_{i,y}=c_y\) 的方案数。求解 \(g\) 可以先将所有 \(a_{x,y}\) 在 \([1,\min(r_x,c_y)]\) 范围内随便填,这样可能实际的 \(r,c\) 偏小,这可以通过容斥钦定哪些 \(r,c\) 偏小,然后强制要求这一行/这一列的 \(a\) 都 \(<r/c\) 来解决。容斥后最终的贡献柿子形如 \(\prod_{x=1}^{n}\prod_{y=1}^{m}\min(r_x,c_y)\)。
注意到贡献全是两个数的 \(\max\) 或者 \(\min\),于是可以将 \((k-\max(r_x,c_y)+1)\) 的贡献在较大值处计算,\(\min(r_x,c_y)\) 的贡献在较小值出计算,设 \(f_{i,x,y}\) 表示已经将 \(\le i\) 的 \(r,c\) 都填写了,且已经填写了 \(x\) 个 \(r\),\(y\) 个 \(c\) 的总贡献。新建一个 \(r\) 时,就对已经填写的所有 \(c\) 计算 \((k-r+1)^y\) 的贡献,对还未填写的所有 \(c\) 计算 \(\min(r_x,c_y)\) 的贡献。
但注意到最后还要将 \(r,c\) 进行分配,因此要乘上 \(\frac{n!m!}{\prod_{i=1}^{k}(x_i)!(y_i)!}\) 的贡献,于是需要再 \(dp\) 中再开两维分别表示已选择的数中 \(r=i\) 的有 \(x\) 个,\(c=j\) 的有 \(y\) 个,每次增加一个 \(r=i\) 的或者 \(c=j\) 的进行转移,这样一来会出现重复计算,同一种方案会被计算 \(\prod_{i=1}^{k}\binom{x_i+y_i}{x_i}\) 次。实际上的答案要乘上 \(\frac{n!m!}{\prod_{i=1}^{k}(x_i)!(y_i)!}\prod_{i=1}^{k}\binom{x_i+y_i}{x_i}=\frac{n!m!}{\prod_{i=1}^{k}(x_i+y_i)!}\),可以发现抵消后我们只用关心 \(x+y\) 是多少,就可以将状态数优化到 \(\mathcal O(n^4)\) 了,最终复杂度也为 \(\mathcal O(n^4)\)。
AGC040
AGC040D - Balance Beam
给定 \(n\) 条长度为 \(1\) 的边,A 通过第 \(i\) 条边的速度为 \(\dfrac{1}{a_i}\),B 通过第 \(i\) 条边的速度为 \(\dfrac{1}{b_i}\)。
现在 A 可以对着 \(n\) 条边进行排序组成一条链,然后 A 从左端点出发,B 在链上随机一个实数点出发向右走,问 A 能追上 B 的概率最大是多少。\(n\le 10^5\)。
view solution
对于这种位移固定的行程问题,考虑作出时间-位移图象(时间是纵坐标),那么 A 和 B 的行进路线就是从 \((0,0)\) 出发,分别到 \((n,\sum a_i)\) 与 \((n,\sum b_i)\) 的两条折线。
接下来将 B 的图象向下平移直到再平移就不与 A 图象相交为止。若此时 B 图象与 \(x\) 轴交点为 \((p,0)\),那么答案就是 \(\dfrac{p}{n}\)。问题转化为如何最大化 \(p\)。考虑从 \((p,0)\) 出发,先沿 B 图象走,走到与 A 的交点时就改为走 A 图象,最终走到 \((n,\sum a_i)\)。于是最大化 \(p\) 相当于要最大化从 \((p,0)\) 到 \((n,\sum a_i)\) 的平均斜率。
枚举 \(p\) 所在的边 \(x\),那么如果将边 \(i\) 放在 \(x\) 后面,它至多贡献 \(\max(a_i,b_i)\) 的斜率。于是将所有边按 \(\max(a_i,b_i)\) 排序,选择一个后缀放在 \(x\) 后,可以发现一定可以通过将它们按 \(a_i-b_i\) 排序使得贡献全部取到 \(\max(a_i,b_i)\)。于是可以通过二分找到最小的后缀满足 \(\sum \max(a_i,b_i)>\sum a_i-b_x\)。然后就可以算出 \(p\) 的大小更新答案了。复杂度为 \(\mathcal O(n\log n)\)。
AGC040E - Prefix Suffix Addition
有一个长为 \(n\) 的序列 \(a_1,a_2,\dots,a_n\)。初始所有 \(a_i\) 都为 \(0\),可以进行以下两种操作:
- 选定整数 \(k(1\le k\le n)\) 与不下降非负序列 \(c_1,c_2,\dots,c_k\),对所有 \(1\le i \le k\),令 \(a_i\) 加上 \(c_i\)。
- 选定整数 \(k(1\le k\le n)\) 与不上升非负序列 \(c_1,c_2,\dots,c_k\),对所有 \(1\le i \le k\),令 \(x_{N-k+i}\) 加上 \(c_i\)。
问最少进行多少次操作使得最后对任意 \(i\) 有 \(x_i=A_i\)。\(n\le 2\times 10^5,A_i\le 10^9\)。
view solution
首先前后缀操作显然可以转化为对原序列任意一个区间,增加一个不下降序列或不上升序列。
另一个重要结论是:存在一种最优方案使得同一种操作的所有区间互不相交。证明考虑调整法,对于相交的两个区间,直接将相交的部分叠加到某一个操作上即可。
于是可以对位置 \(i\) 设 \(b_i\) 表示操作 1 对位置 \(i\) 的贡献,\(c_i\) 表示操作 2 对位置 \(i\) 的贡献。如果 \(b_i,c_i\) 已经确定,那么接下来就只需要将 \(b_i\) 拆分成若干个不下降子序列,\(c_i\) 拆分成若干个不上升子序列,于是操作数 \(=\sum_{i=1}^{n}[b_i>b_{i+1}]+[c_i<c_{i+1}]\)。
对于这一问题就可以设 \(dp\) 状态 \(f_{i,j}\) 表示考虑了前 \(i\) 个位置,\(b_i=j\) 时的最小操作数,有:
因此 \(f_{i,j}\) 是随着 \(j\) 的增加单调不增的并且 \(f_{i,0}\le f_{i,a_i}+2\)。因此我们只需要维护 \(f_{i,j}=f_{i,a_i}+2,f_{i,a_i}+1,f_{i,a_i}\) 的三个 \(j\) 的区间即可。
AGC040F - Two Pieces
AGC041
AGC041E - Balancing Network
一个平衡网络由 \(n\) 根导线与 \(m\) 个平衡器组成。从左到右第 \(i\) 个平衡器连接导线 \(x_i\) 与 \(y_i\),可以指定方向为上/下。当一个令牌从第 \(i\) 根导线进入时,从左到右遍历每一个平衡器,如果该平衡器方向为下且令牌在导线 \(x_i\) 上,令牌转移到 \(y_i\);如果该平衡器方向为上且令牌在导线 \(y_i\) 上,令牌转移到 \(x_i\);否则令牌不移动。
如果一组给平衡器定向的方案,能使得无论令牌从哪根导线进入,最终都会停留在同一根导线上,则称这组方案是均匀的,否则称为不均匀的。要求构造一组均匀的方案以及一组不均匀的方案,或判断无解。
\(n\le 50000,m\le 100000\)。
view solution
均匀方案:
枚举最终走到的导线 \(x\),从右到左加入每一个平衡器,记录 \(pd_i\) 表示仅考虑当前的平衡器时从 \(i\) 出发能否到达 \(x\)。那么对于平衡器 \((a,b)\) ,如果 \(pd_a,pd_b\) 都 \(=0\) 或都 \(=1\) 就随便定,否则就从 \(=0\) 的指向等于 \(1\) 的,然后就可以将 \(pd_a,pd_b\) 都赋值为二者的或了。最后看是否所有 \(pd_i\) 都等于 \(1\) 即可。
直接实现是 \(\mathcal O(n^2)\) 的,由于只有或操作可以用 \(bitset\) 同时维护最终导线为 \(1\sim n\) 时的 \(pd\) 优化到 \(\mathcal O(\frac{n^2}{\omega})\)。
不均匀方案:
由于 \(m>0\),\(n=2\) 一定无解,可以构造证明 \(n>2\) 一定有解:
还是从右到左加入平衡器,记录 \(to_i\) 表示当前从 \(i\) 出发能走到的导线,\(siz_i\) 表示最终到达的导线为 \(i\) 的有多少个。对于平衡器 \((a,b)\),如果 \(to_a=to_b\) 那么随便定没有任何影响;否则注意到定向为 \(a\rightarrow b\) 相当于让 \(siz_{to_a}--,siz_{to_b}++\),于是我们去 \(siz_{to_a}\) 与 \(siz_{to_b}\) 中较小的一个 \(+1\) 即可,由于 \(siz_{to_a}+siz_{to_b}\le n\) 且 \(n>2\),因此它们的较小值一定 \(<n-1\),如此操作不会有任何一个 \(siz\) 会 \(=n\)。
AGC041F - Histogram Rooks
一个 \(n\) 行 \(n\) 列的正方向棋盘,但第 \(i\) 列只有最下方的 \(h_i\) 个格子有效。可以在任何一个有效格子上放置车使得所有与该车在同一行/同一列并且与其之间的格子全都有效的格子被覆盖。问有多少种放置车的方案使得所有有效格子都被覆盖。对 \(998244353\) 取模,\(n\le 400\)。
view solution
对于“所有都”的问题,不难想到直接容斥,即钦定哪些格子没有被覆盖,此时就会有一些位置被钦定不能放置车,贡献即为 \(2\) 的其余位置数量次方乘上容斥系数 \((-1)^{|S|}\)。
但直接枚举复杂度很高且不好 \(dp\)。注意到如果一个格子被钦定了,它所在的列都不能放置车。于是考虑先枚举列的集合 \(S\) 表示 \(S\) 中的列有格子被钦定了,然后再对每一个行连续段分别考虑,此时就只用管对行的限制了。
对于每一个行连续段,不妨设其大小为 \(sz\),有 \(p\) 个格子在被钦定的列中,那么有两种情况:
- 这 \(p\) 个格子都没有被钦定,那么其余位置可以随意选择,贡献为 \(2^{len-p}\)。
- 这 \(p\) 个格子中有被钦定的,那么其余位置只能不放车,只有一种方案,但还需要枚举哪些格子被钦定算上容斥系数,因此总贡献为 \(\sum_{i=1}^{p}(-1)^i\binom{p}{i}=-\binom{p}{0}=-[p>0]\)
但直接这样算还有一个重大问题:可能会有一些被钦定的列最后没有一个格子被钦定。对此的做法是:再加一层容斥,额外枚举 \(T\subset S\) 表示钦定 \(T\) 中列没有任何一个格子被选择,再乘上容斥系数 \((-1)^{|T|}\)。
此时再考虑每个行连续段,第一种情况贡献不变,对于第二种情况,记 \(q\) 表示有 \(q\) 个格子在 \(T\) 中的列里,那么这 \(q\) 个格子无法被选择,贡献为 \(\sum_{i=1}^{p-q}(-1)^i\binom{p-q}{i}=-[p-q>0]=-[p\not=q]\)。
现在可以考虑 \(dp\) 了,但存在一个问题是每个行连续段的 \(p,[p\not=q]\) 并不是独立的,考虑行连续段之间的关系是什么,对于 \(h\) 建立笛卡尔树。每次对当前区间取出其最小值,将区间划分为左右两部分,那么这一个连续段的 \(p\) 与 \(p\not=q\) 就可以有这两个部分的值以及中间一列的决策来得到,于是可以树形 \(dp\),记 \(f_{i,j,0/1}\) 表示当前 考虑 \(i\) 的子树,且 \(i\) 对应的连续段的 \(p\) 为 \(j\),以及 \(p\) 是否等于 \(q\)。树形背包转移即可。
AGC043
AGC043D - Merge Triplets
给定如下构造长为 \(3n\) 的排列 \(P\) 的方法:
先任意生成一个长为 \(3n\) 的排列 \(A\),然后对于 \(\forall k\in[0,n-1]\),将 \(A_{3k},A_{3k+1},A_{3k+2}\) 分为一组。有 \(n\) 个指针分别指向每一组的第一个数。
接下来不断取出当前指针指的所有数中最小的一个放在 \(P\) 的最后,然后将对应的指针向右移动一格,移出所在组了就将这一指针删除。
问最终能生成多少种不同的排列 \(P\)。\(n\le 2000\)。
view solution
考虑判定一个排列是否合法:
考虑这个排列中数的最大值,显然它必须在这个排列的最后三个位置,否则一定不合法,并且在它之后出现的数一定与它同组。于是可以将它以及它之后的数组成一段,对其余部分离散化后递归处理。最终我们得到了若干长为 \(1,2,3\) 的段,那么原题中的每一组一定由:
- 长为 \(3\) 的段。
- 一个长为 \(1\) 的段与一个长为 \(2\) 的段。
- 三个长为 \(1\) 的段。
注意到这些组合对所选择的段没有任何的要求,因此只要满足 \(1\) 的数量 \(\ge\) \(2\) 的数量就一定可以得到一组合法的 \(A\)。
于是最终的判定相当于取出 \(P\) 中的所有前缀 \(\max\),将 \(P\) 分为了若干段,满足每段长度都不超过 \(3\) 且 \(1\) 的数量 \(\ge 2\) 的数量则可以被构造出来。设 \(dp\) 状态 \(f_{i,j}\) 表示考虑了 \(P\) 中的前 \(i\) 个数,\(i\) 是某一段的末尾,且当前 \(1\) 的数量减 \(2\) 的数量 \(=j\) 时的方案数。即可 \(\mathcal O(n^2)\) 完成转移。
AGC043E - Topology
给定 \(n\),对于全集 \(U=\{0,1,\dots,n-1\}\),对于 \(U\) 的每个子集 \(S\),记 \(B_S\) 为点集 \(\{(i+0.5,0.5)|i\in S\}\),给定 \(A_S\) 。要求构造一条闭合曲线使得对于所有 \(A_S=1\) 的 \(S\),满足存在一种方法将该折线在不触碰 \(B_S\) 的条件下移动到 \(x\) 坐标以下,对于 \(A_S=0\) 的 \(S\) 则不存在,或者判断无解。
\(n\le 8\),要求最终曲线长度不超过 \(250000\)。
view solution
可以发现 \(A_S\) 应当存在传递性,即如果 \(A_S=0\),那么对于 \(\forall S\subset T\) 都有 \(A_T=0\),同时如果 \(A_S=1\),那么对于 \(\forall T\subset S\) 都有 \(A_T=1\)。判定完这一条之后现在我们只用考虑所有极小的满足 \(A_S=0\) 的子集 \(S\) 即可。
考虑对每一个 \(S\) 构造一条从 \((0,0)\) 出发到 \((0,0)\) 结束的曲线,满足它会被集合 \(S\) 挡住,但去掉 \(S\) 中的任何一个点它都能成功移动,并且 \(S\) 之外的点对它没有任何影响,然后将所有曲线拼起来即可。
考虑对于某一个 \(S\) 以及闭合曲线如何判定是否能够成功移动。从这条曲线的任何一个位置开始沿任何一个方向移动,如果经过了 \((i+\frac{1}{2},1)\) 就写下 \(u_i\),经过 \((i+\frac{1}{2},0)\) 就写下 \(d_i\)。最终写出的序列中如果相邻的两个字符相同,可以直接将这一段拉走,即将这两个字符消去。于是只要可以通过每次消去相邻且相同两个字符可以将这一序列删空,则 \(A_S=1\)。
想出这个判定后,就不难给出构造了:
递归构造,对于当前集合 \(S\),如果 \(|S|=1\) ,直接绕这个点一圈构造 \(u_id_i\) 即可。否则,取 \(S\) 中最小的数 \(i\),先构造 \(S/i\) 的方案 \(T\),先穿过 \(i\) 的上方,按 \(T\) 走完之后的点,再从 \(i\) 上方走回来;然后再穿过 \(i\) 的下方,按 \(T^{-1}\)(将 \(T\) 翻转得到的结果)走完之后的点,再从 \(i\) 下方走回来。最终得到 \(u_iTu_id_iT^{-1}d_i\),可以发现它没有任何两个相邻字符相同,一定非法,但删去任何一个点之后它都合法。
最终长度限制还是比较宽裕的。
AGC043F - Jewelry Box
AGC024
AGC024E - Sequence Growing Hard
给定 \(n,k,m\) ,问有多少个序列组 \((A_0,A_1,\dots,A_n)\) 满足以下条件:
- \(A_i\) 序列元素个数为 \(i\)。
- 所有序列的元素都在 \([1,k]\) 内。
- \(A_i\) 是 \(A_{i+1}\) 的子序列
- \(A_i\) 字典序小于 \(A_{i+1}\)。
答案对 \(m\) 取模。\(n,k\le 300,m\le 10^9\)。
view solution
核心转化:
- 加元素难以处理,可以反过来考虑删元素。
- 对序列进行操作的问题,遇到限制条件 \(a_i>a_{i+1}\) 或 \(a_i<a_{i+1}\),可以考虑枚举最小数/最大数的位置。
对于原问题,可以发现从 \(A_i\) 到 \(A_{i+1}\) 相当于在 \(A_i\) 中加一个元素,字典序的限制则要求如果这个元素被放在 \(c_i\) 前方,则必须 \(\ge c_i\)。如果 \(=c_i\),那么得到的序列和放到 \(c_i\) 之后是一样的,因此我们可以假设加入的元素必须 \(>c_i\)。
但这个问题还是很难处理,考虑将问题倒过来,转化为初始有一个序列 \(A_n\),每一步可以选择 \(A_n\) 中的一个元素 \(s_i\) 删去,但必须满足 \(s_i>s_{i+1}\)。
对于这个限制条件,可以想到枚举 \(A_n\) 序列中的最小数的第一次出现的位置,设为 \(p\),那么 \([p+1,n]\) 区间中的元素都必须在 \(s_p\) 之前被删去,那么 \([p+1,n]\) 区间与 \([1,p-1]\) 区间就会一直被 \(s_p\) 隔开而不会互相产生影响,可以划分出两个子问题,当然还有一个额外的限制就是区间中的元素必须 \(\ge s_p\) 或者 \(>s_p\),于是考虑状态 \(dp_{i,j}\) 表示长为 \(i\) 的序列在元素必须 \(\ge j\) 的情况,有多少种删法。转移时枚举最小数以及其第一次出现的位置,有:
后面乘的组合数是分配这 \(n\) 个元素的删除顺序。直接转移复杂度为 \(\mathcal O(n^2m^2)\),但注意到对于同一个 \(p\),\(dp_{i,j}\) 与 \(dp_{i,j+1}\) 的转移相比,只增加了一个 \(\mathcal O(1)\) 计算的 \(dp_{p-1,j+1}dp_{n-p,j}\),因此可以优化到 \(\mathcal O(n^2m)\)。