AtCoder ARC 做题记录

ARC 做题记录

ARC001-099#

ARC069F#

题意:给定 n 组数 (xi,yi),要求从每一组中选出一个数,使得相差最小的两个数差值最大。求最大差值。

1n104,1xi,yi109

解法:

直接二分答案。二选一直接 2-SAT,直接建边会炸就线段树优化。

具体来说,将 xiyi 一起排序,建立一棵叶子的权值有序的线段树,如果叶子表示 xi,就连一条边到 yi 代表的点。那么二分 mid 之后,xi(ximid,xi+mid) 连边即可。

ARC075E#

这大水题吧。

题意:给一个长度为 N 的序列 a,求有多少个区间的平均值不小于 K

1N2×105

解法:

平均值,直接将 ai 减去 K,问题转化为多少个区间满足区间和非负。考虑固定右端点,对左端点计数。左端点需要满足前缀和小于等于右端点的前缀和,这是一个二维数点问题。

submissions

ARC100-199#

ARC107E#

有一个 n×n 的矩形 A,给定这个矩形的第一行和第一列。Ai,j,i>1,j>1 定义为 mex{Ai1,j,Ai,j1}。给定第一行第一列中只有 012,容易证明整个矩阵中也只有这三种数字。求矩阵中有多少个 012

1n500,000

解法:

打表发现,对于 i>5j>5ai,j=ai1,j1,具体证明需要一些性质,比较繁琐。所以只需要将前五行和前五列求出来简单计算即可。

Submission

ARC107F#

给定一个 n 个点 m 条边的无向图,每个点有权值 aibi,定义一个连通块的权值为 b 之和的绝对值。可以删去任意个点,删去点 i 代价为 ai,求总权值减去总代价的最小值。

1n,m300

解法:

i 有三种可能:贡献为 bi,贡献为 bi,贡献为 ai

建立最小割模型:先将答案加上 ai,然后减去最小割。

i 拆成两个点 ii,从源点向 i 连接一条权值为 aibi 的边,从 i 向汇点连接一条 ai+bi 的边,ii 之间连接一条无穷的边。表示如果删掉第一条边,贡献为 bi,第二条边类似,两条边都删去贡献为 ai

但是还要求同一个连通块中的贡献的 b 的符号是相同的,所以对于一条边 (u,v),从 uv 连一条无穷的边,这样可以限制 uv 都割了相同类型的边。vu 同理。

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

Submission

ARC147C#

好题,做法挺妙的。

题意:

给定 n 个限制 (li,ri),要求选定 n 个变量满足 lixiri。使得下列式子最小化:

i=1n1j=i+1n|xixj|

求该式子最小值。

n3×105

解法:

l 中最大值为 Xr 中最小值为 Y,则,

  • xy,那么所有 l 均小于等于 X,所有 r 均大于等于 Y,取任一 XxiY,所有数均能取到此值,答案为 0

  • 否则,则必然所有 xi 都在 (Y,X) 之间。考虑若 xi<Y,由于其右端点必定大于等于 Y,则必定可以将其调整到 Y 位置,答案不会变得更劣。同理若 xi>X,也可以将其调整到 X

    XY 所代表区间分别为 LR,除了 LR 以外的区间,两两之间的贡献设为 C,则原式可以拆成

    iL,R(xiY)+iL,R(Xxi)+(XY)+C

    此时除了 C 以外的贡献为 (n1)(YX),显然,需要最小化 YX。将 r 降序排序,l 升序排序,对应位置组合,就能得到最小贡献。

    C 的贡献相当于一个子问题,可以重复解决。

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

Submissions

洛谷双倍经验题

ARC153C#

非常好的构造题。

题意:给定一个长度为 N 的序列 aiai{0,1},需要构造一个 严格递增 序列 bi,满足 |bi|1012,并且 i=1naibi=0,或者报告无解。

解法:

调整。首先钦定 bi=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 就可以了。设 fi,j 表示前 i 个位置填完了,有 j 个点是 +,的答案,设辅助 gi,j 表示方案数。

submission

ARC167F#

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

解法:

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

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

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

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

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

ARC179D#

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

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

  • 将门设置在当前节点

  • 传送到门

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

1N2×105

解法:

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

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

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

gu=min(gv+2,hv)

fu=min(gv+2,hv)+min(min(fv+1,hv)min(gv+2,hv))

其中 hu 表示以 2×szumaxdepu1,叶子结点的 maxdep0hu 意味着将传送门设置在 u 节点,按照 dfn 序遍历完所有节点后停留在最深的节点,然后跳转到 u

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

Submissions

ARC189B#

好题。

给定一个长为 N 的序列 Xi,可以进行任意次操作,每一次操作:

  • 选定一个位置 i,记 XiXi+3 的中点为 M,将 Xi+1Xi+2 关于 M 对称翻转。

求经过任意次操作后,所有 Xi 的和的最小值。

4N2×105

0X1<X2<<XN1012

解法:

不知道哪个天才想到,这个操作的本质是将 i+1i+3 的差分值交换。

于是操作变为将差分数组中奇偶性相同的两个位置交换。于是分成奇数和偶数分别排序,就能得到最小答案。

ARC190B#

有一个 N×N 的矩形,定义 KL 形为一个 K×K 的矩形的最左(或右)侧一行与最上(下)面一列组成的图形。显然使用 1NL 形个恰好一次可以将 N×N 的矩形覆盖。

给定 ab,有 q 次询问,第 i 次询问给定 ki,求 (a,b)kiL 形覆盖的方案数。

1N107,1Qmin{N,2×105}

解法:

考虑 1kL 形必定组成一个 k×k 的矩形。

考虑 (a,b) 出现在 kL 形上的条件:其必须在这个 k×k 的矩形的边上或角上。

考虑矩形内部的贡献:

  • k=1 时,只有 1 种方案。
  • 当点在角上的时候,有 3×4k2 种方案。
  • 当点在边上的时候,有 2×4k2 种方案。

再考虑矩形外部的方案数:每一个 k+1n 阶的 L 形可以选择在这个矩形的上面覆盖或下面覆盖,在矩形的左侧覆盖或右侧覆盖,且这两种选择独立。假设我们希望 k×k 矩形的左上角为 (x,y),那么方案数就是 (nkx1)(nky1),即在未选择的 L 形中选择一些放在左侧或上面。

矩形的左上角是什么呢?当 (a,b) 在角上的时候,左上角显然是确定的,且只有 O(1) 个,可以直接计算。

(a,b) 在边上的时候,假设在 k×k 矩形的上边,其它情况同理。则矩形左上角为 (a,i),需要满足 b[i+1,i+k2],即 b+2kib1。列的方案数是 i=b+2kb1(nki1),即 i=b+1kb2(nki)。即 fk 等于这个式子,那么总方案数是 (nka1)fk

考虑如何计算 fkk 从大到小枚举,这是很经典的一行组合数的一个区间移动到下一行,只要乘二之后减去一些即可。

Submission

ARC193A - Complement Interval Graph(Difficulty: 1234)#

一开始看错题了,四十几分钟的时候模样例发现不对劲,仔细一看发现看成只能走相交的区间了。

容易发现,最多只会经过四个区间,只需要离线询问处理出满足一些限制的区间中 w 最小的即可。

ARC193B - Broken Wheel(Difficulty: 2420)#

由于总度数一定,当 0n1 的入度确定时,n 的度数被唯一确定。所以只需要关心 0n1 有多少种可能的度数序列。

先不考虑环边 (n1,0)。设 fi,0/1/2 表示,已经确定了 0i1 的度数,有多少个合法的度数序列。合法的度数序列满足存在一种给 (0,1),(1,2),,(i1,i) 这些边与所有形如 (j<i,n) 的边定向的方式,使得 0i1 的度数与这个度数序列相等。

第二维的 0 表示 i1i 之间的边定向为 i1i1 表示定向为 i1i2 表示两种定向方式都能使得度数序列合法。

考虑从 i1 转移到 i,那么需要确定 ii1 这条边的方向,此时会确定 i1 的度数。

考虑枚举 i1 的度数。若 i1 度数为 0,那么 i1i2 之间的边必须为 i2i1ii1 的边必须为 i1i。故从 fi1,0/2 转移到 fi,0

其它情况以此类推,注意考虑 si1=1 时,可能 ii1 之间的边两种都可以选择。即可得到转移。

最后考虑上环边。只要最开始枚举 x,令 f0,x1,最后 fn,x 就是答案。

还有一个问题是无论 x 枚举的是多少,都会算到度数全部为 1 的情况,这种情况会被算 3 次,所以答案要减去 2

作者:Terminator-Line

出处:https://www.cnblogs.com/Terminator-Line/p/18702808

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   Terminator-Line  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示