Loading

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\),问题转化为多少个区间满足区间和非负。考虑固定右端点,对左端点计数。左端点需要满足前缀和小于等于右端点的前缀和,这是一个二维数点问题。

submissions

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}\),具体证明需要一些性质,比较繁琐。所以只需要将前五行和前五列求出来简单计算即可。

Submission

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''\) 同理。

这样网络中可能有负权边,负权边直接割掉肯定不劣。

Submission

ARC147C

好题,做法挺妙的。

题意:

给定 \(n\) 个限制 \((l_i,r_i)\),要求选定 \(n\) 个变量满足 \(l_i\le x_i\le r_i\)。使得下列式子最小化:

\[\sum_{i=1}^{n-1}\sum_{j=i+1}^{n}\lvert x_i-x_j\rvert \]

求该式子最小值。

\(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\) 的贡献相当于一个子问题,可以重复解决。

    实际写代码其实非常简便,可以参考提交记录。

Submissions

洛谷双倍经验题

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\),说明前缀和均为非正数,无论如何操作,都不能使得前缀和减小,故必要性得证。

Submissions

ARC164D

题意比较复杂,但是梳理完之后其实并不困难。大概是说若 \(s\) 是一个 \(+\)\(-\) 组成的字符串,定义 \(p(s)\) 是这个字符串有关的一个问题的解。给定一个某些位置是 \(?\) 的字符串,求可能的 \(p\) 之和。

解法:

乍一看比较困难,但是认真梳理一下,发现每一个点的方向是确定的,点 \(i\) 的方向为右等价于其左侧同色个数大于等于异色个数。再发现向右的点对 \(p\) 的贡献是 \(-i\),向左是 \(i\),那么直接 DP 就可以了。设 \(f_{i,j}\) 表示前 \(i\) 个位置填完了,有 \(j\) 个点是 +,的答案,设辅助 \(g_{i,j}\) 表示方案数。

submission

ARC167F

\(n\) 个括号串,求是否能重排之后拼起来形成合法括号序。

解法:

很显然是贪心,但是刚开始做的时候不加证明,直接 WA 了 3 发,浪费了很多时间。最后看了洛谷题解。

首先,同一个串内,如果有 () 可以直接消除。那么每个串都形如 )))((( 的形式,即一段前缀 ) 和一段后缀 ( 拼起来。

直接贪心,若左括号个数更多,将其放在第一类中,否则放在第二类。那么第一类显然放在第二类左侧。考虑第一类之间,右括号少的尽可能放在左侧;第二类之间,左括号少的尽可能放在右侧。

拼起来之后判一下合法即可。

https://atcoder.jp/contests/abc167/submissions/59133602

ARC179D

题意:给定一棵 \(N\) 个节点的树,要求在上面行走。可以进行下列操作,初始门和人在同一个任意节点:

  • 从一个点移动到另一个点。

  • 将门设置在当前节点

  • 传送到门

第一个操作花费 1 代价,后两个操作不花费代价,要求将所有节点至少遍历一次,求最小代价。

\(1\le N\le 2\times 10^{5}\)

解法:

解法:注意到一定是按照 DFN 序进行遍历。更具体地,每一次进入一个子树之后,在遍历完子树之前不会跳出来,因为不会更优。

遍历完子树回到父亲时,可以将门设置在父亲处,这样不会影响遍历兄弟。所以各子树是独立的,启示进行树形 DP。

注意到最后不必回到出发点,设 \(f_u\) 表示遍历完 \(u\) 子树不回到根,\(g_u\) 表示遍历完 \(u\) 子树而回到根。那么有转移

\[g_u=\sum\min(g_v+2,h_v) \]

\[f_u=\sum \min(g_v+2,h_v)+\min(\min(f_v+1,h_v)-\min(g_v+2,h_v)) \]

其中 \(h_u\) 表示以 \(2\times sz_u-maxdep_u-1\),叶子结点的 \(maxdep\)\(0\)\(h_u\) 意味着将传送门设置在 \(u\) 节点,按照 dfn 序遍历完所有节点后停留在最深的节点,然后跳转到 \(u\)

定根之后可以得到以根为起始点的答案。换根 DP 即可。但是很 shit。

Submissions

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\) 从大到小枚举,这是很经典的一行组合数的一个区间移动到下一行,只要乘二之后减去一些即可。

Submission

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}\) 列,所以不可能达到目标状态。于是行翻转已经确定完了,再考虑列,这题就做完咯。

posted @ 2025-02-07 16:18  Terminator-Line  阅读(178)  评论(0)    收藏  举报