AtCoder ARC 做题记录
ARC 做题记录
ARC001-099
ARC069F
题意:给定 \(n\) 组数 \((x_i,y_i)\),要求从每一组中选出一个数,使得相差最小的两个数差值最大。求最大差值。
\(1\le n\le 10^{4},1\le x_i,y_i\le 10^{9}\)
解法:
直接二分答案。二选一直接 2-SAT,直接建边会炸就线段树优化。
具体来说,将 \(x_i\) 和 \(y_i\) 一起排序,建立一棵叶子的权值有序的线段树,如果叶子表示 \(x_i\),就连一条边到 \(y_i\) 代表的点。那么二分 \(mid\) 之后,\(x_i\) 向 \((x_i-mid,x_i+mid)\) 连边即可。
ARC075E
这大水题吧。
题意:给一个长度为 \(N\) 的序列 \(a\),求有多少个区间的平均值不小于 \(K\)。
\(1\le N\le 2\times 10^{5}\)
解法:
平均值,直接将 \(a_i\) 减去 \(K\),问题转化为多少个区间满足区间和非负。考虑固定右端点,对左端点计数。左端点需要满足前缀和小于等于右端点的前缀和,这是一个二维数点问题。
ARC100-199
ARC107E
有一个 \(n\times n\) 的矩形 \(A\),给定这个矩形的第一行和第一列。\(A_{i,j},i>1,j>1\) 定义为 \(\operatorname{mex}\{A_{i-1,j},A_{i,j-1}\}\)。给定第一行第一列中只有 \(0\) 或 \(1\) 或 \(2\),容易证明整个矩阵中也只有这三种数字。求矩阵中有多少个 \(0\),\(1\),\(2\)。
\(1\le n\le 500,000\)
解法:
打表发现,对于 \(i>5\) 且 \(j>5\) 有 \(a_{i,j}=a_{i-1,j-1}\),具体证明需要一些性质,比较繁琐。所以只需要将前五行和前五列求出来简单计算即可。
ARC107F
给定一个 \(n\) 个点 \(m\) 条边的无向图,每个点有权值 \(a_i\) 和 \(b_i\),定义一个连通块的权值为 \(b\) 之和的绝对值。可以删去任意个点,删去点 \(i\) 代价为 \(a_i\),求总权值减去总代价的最小值。
\(1\le n,m\le 300\)。
解法:
点 \(i\) 有三种可能:贡献为 \(b_i\),贡献为 \(-b_i\),贡献为 \(-a_i\)。
建立最小割模型:先将答案加上 \(\sum a_i\),然后减去最小割。
将 \(i\) 拆成两个点 \(i'\) 和 \(i''\),从源点向 \(i'\) 连接一条权值为 \(a_i-b_i\) 的边,从 \(i''\) 向汇点连接一条 \(a_i+b_i\) 的边,\(i'\) 和 \(i''\) 之间连接一条无穷的边。表示如果删掉第一条边,贡献为 \(b_i\),第二条边类似,两条边都删去贡献为 \(-a_i\)。
但是还要求同一个连通块中的贡献的 \(b\) 的符号是相同的,所以对于一条边 \((u,v)\),从 \(u'\) 向 \(v''\) 连一条无穷的边,这样可以限制 \(u\) 和 \(v\) 都割了相同类型的边。\(v'\) 到 \(u''\) 同理。
这样网络中可能有负权边,负权边直接割掉肯定不劣。
ARC147C
好题,做法挺妙的。
题意:
给定 \(n\) 个限制 \((l_i,r_i)\),要求选定 \(n\) 个变量满足 \(l_i\le x_i\le r_i\)。使得下列式子最小化:
求该式子最小值。
\(n\le 3\times 10^{5}\)
解法:
设 \(l\) 中最大值为 \(X\),\(r\) 中最小值为 \(Y\),则,
-
若 \(x\le y\),那么所有 \(l\) 均小于等于 \(X\),所有 \(r\) 均大于等于 \(Y\),取任一 \(X\le x_i\le Y\),所有数均能取到此值,答案为 \(0\)
-
否则,则必然所有 \(x_i\) 都在 \((Y,X)\) 之间。考虑若 \(x_i<Y\),由于其右端点必定大于等于 \(Y\),则必定可以将其调整到 \(Y\) 位置,答案不会变得更劣。同理若 \(x_i>X\),也可以将其调整到 \(X\)。
设 \(X\) 和 \(Y\) 所代表区间分别为 \(L\) 和 \(R\),除了 \(L\) 和 \(R\) 以外的区间,两两之间的贡献设为 \(C\),则原式可以拆成
\[\sum_{i\not=L,R} (x_i-Y)+\sum_{i\not=L,R} (X-x_i)+(X-Y)+C \]此时除了 \(C\) 以外的贡献为 \((n-1)(Y-X)\),显然,需要最小化 \(Y-X\)。将 \(r\) 降序排序,\(l\) 升序排序,对应位置组合,就能得到最小贡献。
\(C\) 的贡献相当于一个子问题,可以重复解决。
实际写代码其实非常简便,可以参考提交记录。
ARC153C
非常好的构造题。
题意:给定一个长度为 \(N\) 的序列 \(a_i\),\(a_i\in \{0,1\}\),需要构造一个 严格递增 序列 \(b_i\),满足 \(\left | b_i \right | \le 10^{12}\),并且 \(\sum_{i=1}^{n}a_ib_i=0\),或者报告无解。
解法:
调整。首先钦定 \(b_i=i\),可以得到一个和 \(S\)。若要保证 \(b\) 序列递增的性质,必定要调整 \(b\) 序列的一个前缀减或后缀加。
例如 \(S>0\) 时,可以找到 \(a\) 的一个前缀和为 \(1\) 的区间,将其区间减 \(S\),或是找到一个后缀和为 \(-1\) 的区间,将其区间加 \(S\)。这样必定是充分的。
如果找不到,就是无解。因为 \(a\) 的前缀和是连续的,若存在一个前缀和大于 \(0\),则必然存在前缀和等于 \(1\)。若不存在前缀和等于 \(1\),说明前缀和均为非正数,无论如何操作,都不能使得前缀和减小,故必要性得证。
ARC164D
题意比较复杂,但是梳理完之后其实并不困难。大概是说若 \(s\) 是一个 \(+\) 和 \(-\) 组成的字符串,定义 \(p(s)\) 是这个字符串有关的一个问题的解。给定一个某些位置是 \(?\) 的字符串,求可能的 \(p\) 之和。
解法:
乍一看比较困难,但是认真梳理一下,发现每一个点的方向是确定的,点 \(i\) 的方向为右等价于其左侧同色个数大于等于异色个数。再发现向右的点对 \(p\) 的贡献是 \(-i\),向左是 \(i\),那么直接 DP 就可以了。设 \(f_{i,j}\) 表示前 \(i\) 个位置填完了,有 \(j\) 个点是 +,的答案,设辅助 \(g_{i,j}\) 表示方案数。
ARC167F
给 \(n\) 个括号串,求是否能重排之后拼起来形成合法括号序。
解法:
很显然是贪心,但是刚开始做的时候不加证明,直接 WA 了 3 发,浪费了很多时间。最后看了洛谷题解。
首先,同一个串内,如果有 () 可以直接消除。那么每个串都形如 )))((( 的形式,即一段前缀 ) 和一段后缀 ( 拼起来。
直接贪心,若左括号个数更多,将其放在第一类中,否则放在第二类。那么第一类显然放在第二类左侧。考虑第一类之间,右括号少的尽可能放在左侧;第二类之间,左括号少的尽可能放在右侧。
拼起来之后判一下合法即可。
ARC179D
题意:给定一棵 \(N\) 个节点的树,要求在上面行走。可以进行下列操作,初始门和人在同一个任意节点:
-
从一个点移动到另一个点。
-
将门设置在当前节点
-
传送到门
第一个操作花费 1 代价,后两个操作不花费代价,要求将所有节点至少遍历一次,求最小代价。
\(1\le N\le 2\times 10^{5}\)
解法:
解法:注意到一定是按照 DFN 序进行遍历。更具体地,每一次进入一个子树之后,在遍历完子树之前不会跳出来,因为不会更优。
遍历完子树回到父亲时,可以将门设置在父亲处,这样不会影响遍历兄弟。所以各子树是独立的,启示进行树形 DP。
注意到最后不必回到出发点,设 \(f_u\) 表示遍历完 \(u\) 子树不回到根,\(g_u\) 表示遍历完 \(u\) 子树而回到根。那么有转移
其中 \(h_u\) 表示以 \(2\times sz_u-maxdep_u-1\),叶子结点的 \(maxdep\) 为 \(0\)。\(h_u\) 意味着将传送门设置在 \(u\) 节点,按照 dfn 序遍历完所有节点后停留在最深的节点,然后跳转到 \(u\)。
定根之后可以得到以根为起始点的答案。换根 DP 即可。但是很 shit。
ARC189B
好题。
给定一个长为 \(N\) 的序列 \(X_i\),可以进行任意次操作,每一次操作:
- 选定一个位置 \(i\),记 \(X_i\) 和 \(X_{i+3}\) 的中点为 \(M\),将 \(X_{i+1}\) 和 \(X_{i+2}\) 关于 \(M\) 对称翻转。
求经过任意次操作后,所有 \(X_i\) 的和的最小值。
\(4\le N\le 2\times 10^{5}\)
\(0\le X_1<X_2<\cdots<X_N\le 10^{12}\)
解法:
不知道哪个天才想到,这个操作的本质是将 \(i+1\) 和 \(i+3\) 的差分值交换。
于是操作变为将差分数组中奇偶性相同的两个位置交换。于是分成奇数和偶数分别排序,就能得到最小答案。
ARC190B
有一个 \(N\times N\) 的矩形,定义 \(K\) 阶 \(L\) 形为一个 \(K\times K\) 的矩形的最左(或右)侧一行与最上(下)面一列组成的图形。显然使用 \(1\) 到 \(N\) 阶 \(L\) 形个恰好一次可以将 \(N\times N\) 的矩形覆盖。
给定 \(a\) 和 \(b\),有 \(q\) 次询问,第 \(i\) 次询问给定 \(k_i\),求 \((a,b)\) 被 \(k_i\) 阶 \(L\) 形覆盖的方案数。
\(1\le N\le 10^{7},1\le Q\le \min\{N,2\times 10^{5}\}\)。
解法:
考虑 \(1\) 到 \(k\) 阶 \(L\) 形必定组成一个 \(k\times k\) 的矩形。
考虑 \((a,b)\) 出现在 \(k\) 阶 \(L\) 形上的条件:其必须在这个 \(k\times k\) 的矩形的边上或角上。
考虑矩形内部的贡献:
- 当 \(k=1\) 时,只有 \(1\) 种方案。
- 当点在角上的时候,有 \(3\times 4^{k-2}\) 种方案。
- 当点在边上的时候,有 \(2\times 4^{k-2}\) 种方案。
再考虑矩形外部的方案数:每一个 \(k+1\) 到 \(n\) 阶的 \(L\) 形可以选择在这个矩形的上面覆盖或下面覆盖,在矩形的左侧覆盖或右侧覆盖,且这两种选择独立。假设我们希望 \(k\times k\) 矩形的左上角为 \((x,y)\),那么方案数就是 \(\binom{n-k}{x-1}\binom{n-k}{y-1}\),即在未选择的 \(L\) 形中选择一些放在左侧或上面。
矩形的左上角是什么呢?当 \((a,b)\) 在角上的时候,左上角显然是确定的,且只有 \(O(1)\) 个,可以直接计算。
当 \((a,b)\) 在边上的时候,假设在 \(k\times k\) 矩形的上边,其它情况同理。则矩形左上角为 \((a,i)\),需要满足 \(b\in [i+1,i+k-2]\),即 \(b+2-k\le i\le b-1\)。列的方案数是 \(\sum_{i=b+2-k}^{b-1}\binom{n-k}{i-1}\),即 \(\sum_{i=b+1-k}^{b-2}\binom{n-k}{i}\)。即 \(f_k\) 等于这个式子,那么总方案数是 \(\binom{n-k}{a-1}f_k\)。
考虑如何计算 \(f_k\),\(k\) 从大到小枚举,这是很经典的一行组合数的一个区间移动到下一行,只要乘二之后减去一些即可。
ARC193A - Complement Interval Graph(Difficulty: 1234)
一开始看错题了,四十几分钟的时候模样例发现不对劲,仔细一看发现看成只能走相交的区间了。
容易发现,最多只会经过四个区间,只需要离线询问处理出满足一些限制的区间中 \(w\) 最小的即可。
ARC193B - Broken Wheel(Difficulty: 2420)
由于总度数一定,当 \(0\) 到 \(n-1\) 的入度确定时,\(n\) 的度数被唯一确定。所以只需要关心 \(0\) 到 \(n-1\) 有多少种可能的度数序列。
先不考虑环边 \((n-1,0)\)。设 \(f_{i,0/1/2}\) 表示,已经确定了 \(0\) 到 \(i-1\) 的度数,有多少个合法的度数序列。合法的度数序列满足存在一种给 \((0,1),(1,2),\cdots,(i-1,i)\) 这些边与所有形如 \((j\lt i,n)\) 的边定向的方式,使得 \(0\) 到 \(i-1\) 的度数与这个度数序列相等。
第二维的 \(0\) 表示 \(i-1\) 与 \(i\) 之间的边定向为 \(i-1\leftarrow i\),\(1\) 表示定向为 \(i-1\rightarrow i\),\(2\) 表示两种定向方式都能使得度数序列合法。
考虑从 \(i-1\) 转移到 \(i\),那么需要确定 \(i\) 与 \(i-1\) 这条边的方向,此时会确定 \(i-1\) 的度数。
考虑枚举 \(i-1\) 的度数。若 \(i-1\) 度数为 \(0\),那么 \(i-1\) 与 \(i-2\) 之间的边必须为 \(i-2\leftarrow i-1\),\(i\) 与 \(i-1\) 的边必须为 \(i-1\leftarrow i\)。故从 \(f_{i-1,0/2}\) 转移到 \(f_{i,0}\)。
其它情况以此类推,注意考虑 \(s_{i-1}=1\) 时,可能 \(i\) 与 \(i-1\) 之间的边两种都可以选择。即可得到转移。
最后考虑上环边。只要最开始枚举 \(x\),令 \(f_{0,x}\leftarrow 1\),最后 \(f_{n,x}\) 就是答案。
还有一个问题是无论 \(x\) 枚举的是多少,都会算到度数全部为 \(1\) 的情况,这种情况会被算 \(3\) 次,所以答案要减去 \(2\)。
ARC199A - Flip Row or Col 2(Difficulty: 2285)
绝世好题。
有神秘限制,\(R_i,C_i\lt \frac{N}{4}\)。
先将第一行全部变成 \(0\),那么要翻转恰好 \(R_1\) 列。接着考虑每一行,如果这一行 \(1\) 的数量超过一半,那么这一行一定要反转,否则由于只能翻转 \(R_1\lt \frac{N}{4}\) 列,所以不可能达到目标状态。于是行翻转已经确定完了,再考虑列,这题就做完咯。

浙公网安备 33010602011771号