AtCoder Regular Contest 231 ABCDE
AtCoder Regular Contest 231
Tasks - AtCoder Regular Contest 231
AtCoder Regular Contest 231 ABCDE - f2021ljh - 博客园
A - Two Dimensional Invader
你是一个二维平面上的魔法战士,初始位置位于点 \((0,0)\)。接下来将依次发生 \(N\) 个事件。在第 \(i\) 个事件中(\(1\le i\le N\)),一只怪物会出现在点 \((X_i, Y_i)\) 处,你需要选择是用剑还是用魔法来击败这只怪物:
- 用剑:位置移动到点 \((X_i,Y_i)\),代价等于移动前所在位置与点 \((X_i, Y_i)\) 之间欧几里得距离的平方。
- 用魔法:位置不发生移动,代价等于 \(Z_i\)。
请计算击败所有怪物最终所需的最小总代价。
\(1\le T\le10\),\(\sum N\le2.5\cdot10^5\),\(0\le X_i,Y_i<500\),\(1\le Z_i\le10^9\)。
设 \(f_i(x,y)\) 表示击败当前怪物 \(i\) 且位置在 \((x,y)\) 的最小代价。由于 \(Z_i\) 固定,考虑费用提前计算,设开始时的总费用为 \(\sum Z_i\),如果选了用剑,则再减去 \(Z_i\)。那么有
注意我们没法每次都枚举所有 \(x',y'\),但是 \((\Delta x)^2+(\Delta y)^2\) 可以拆成两部分分别计算,并且每次更新 \(f\) 只对一个位置有影响。于是我们可以预处理一维、枚举一维,这样就把 \(O(M^2)-O(1)\) 变成了 \(O(M)-O(M)\),其中 \(M\) 为网格边长。
设 \(g(x,y)\) 表示当前从第 \(x\) 行的任意一列到 \((x,y)\) 的最小代价,即
由于每次实质上只会更新一个位置,也就是 \(f_i(X_i,Y_i)\),我们更新 \(g\) 的时候也只需要更新第 \(X_i\) 行的信息,即
进而
时间 \(O(NM)\),其中 \(M\) 为网格边长。
初值:起点为 \((0,0)\),故 \(f_0(0,0)=0,g_0(0,y)=y^2\),其余 \(f_0(x,y)=\infty,g_0(x,y)=\infty\)。答案为
Submission #79776377 - AtCoder Regular Contest 231
B - Three Mex
给你非负整数 \(A,B,C\)。请判断是否存在满足以下三个条件的非负整数集合 \(X,Y\),如果存在,请输出一组构造:
- \(\operatorname{mex}X=A\),\(\operatorname{mex}Y=B\),\(\operatorname{mex}\{x\oplus y:x\in X,y\in Y\}=C\)。
- \(X,Y\) 中的元素不超过 \(2026\)。
\(T\le10\),\(0\le A,B,C\le1000\)。
首先令 \(X=\{0,1,\cdots,A-1\}\),令 \(Y=\{0,1,\cdots,B-1\}\),如果能异或出 \(C\) 则无解,否则需要凑出 \(0,1,\cdots,C-1\)。
注意到直接在 \(X\) 中加一个 \(1024\),如果在 \(0,1,\cdots,C-1\) 中缺 \(x\) 则直接在 \(Y\) 中加一个 \(1024\oplus x\) 即可。
C - One Sky, Many Stars
现给定长度为 \(N\) 的非负整数序列 \(X=(x_1,x_2,\cdots,x_N)\) 和 \(D=(d_1,d_2,\cdots,d_N)\),满足 \(x_1<x_2<\dots<x_N\)。
请处理 \(Q\) 次询问,格式如下:
- 给定非负整数 \(p,s\),将 \(d_p\) 的值修改为 \(s\)。
- 对于 \(x\) 和 \(d\),判断是否满足:
- 存在一个整数序列 \(s\),使得对任意 \(i\) 满足 \(\min_j|x_i-s_j|=d_i\)。
- 注意:对 \(d_p\) 的修改会保留并影响后续的所有询问。
\(1\le T\le10\),\(1\le N,Q\le150\,000\),\(0\le x_i,d_i,s\le10^9\),\(1\le p\le N\)。\(\sum N,\sum Q\le2\cdot10^5\)。保证 \(X\) 严格递增。
首先考虑满足条件的序列 \(x,d\) 有什么性质。
对于每一个位置 \(x_i\),我们要让 \(F_i=[x_i-d_i+1,x_i+d_i-1]\) 范围内不存在 \(s_j\)(称为禁用区间),并且让 \(L_i=x_i-d_i,R_i=x_i+d_i\) 这两个位置中的至少一个存在 \(s_j\)。
如果一个位置 \(x\) 不在任何禁用区间内,我们称其为可用位置,则序列不合法,当且仅当存在 \(i\) 使得 \(L_i,R_i\) 都不是可用位置。
这个刻画方式需要判断所有端点位置是否被某一禁用区间覆盖,然而事实上只需要考虑相邻的禁用区间即可。
结论:序列不合法,当且仅当存在一个位置 \(i\),使得 \(L_i,R_i\) 都被 \(F_{i-1}\) 或 \(F_{i+1}\) 覆盖。
证明:
- 首先这样一定可以排除包含的情况。画个图可以知道,如果 \(F_j\) 是 \(i\) 后面第一个包含 \(L_i,R_i\) 的,则要么 \(F_j\) 也包含了 \(L_{j-1},R_{j-1}\),要么 \(F_{j-1}\) 也包含了 \(L_i,R_i\),一直从 \(j\) 回推到 \(i\) 即可证明。
- 现在考虑两两不包含的情况,此时对于任意两个区间 \(F_i,F_j\)(\(i<j\)),一定有 \(L_i<L_j,R_i<R_j\)。那么对于 \(i\),考虑 \(L_i\) 是否被包含只需要考虑 \(j<i\) 的 \(F_j\),考虑 \(R_i\) 是否被包含只需要考虑 \(j>i\) 的 \(F_j\)。以左侧为例,只需要考虑 \(R_j\) 的最大值是否超过 \(L_i\),而 \(R_j\) 的最大值在 \(R_{i-1}\) 取到。右侧同理。
因此,维护一个不合法 \(i\) 的集合,更新 \(d_p\) 时只需要考虑 \(p-1,p,p+1\) 的状态(合法 / 不合法)是否改变即可。时间 \(O(N+Q)\)。
Submission #79796391 - AtCoder Regular Contest 231
D - Choose Your Role
这是一道交互题。有 \(N\) 堆石子,编号为 \(1\) 到 \(N\)。每堆石子初始时各有 \(N - 1\) 颗石子。
先手和后手使用这些石子进行博弈。游戏中,两人轮流操作,由先手先行:
- 先手选择一堆石子数 \(\ge 1\) 的石子堆,并从中移走 \(1\) 到 \(K\) 颗石子(包含两端)。
- 后手选择 \(1\) 到 \(K\) 个不同的石子堆(包含两端,且每个被选中的堆石子数必须 \(\ge 1\)),从每个选中的堆中各移走 \(1\) 颗石子。
首先无法进行合法操作的玩家判负(即谁不能动谁就输)。你将与评测机对弈进行这场游戏。在游戏开始前,你需要先向评测机声明你是选择作为先手还是后手,随后正式开始游戏。
\(2\le N\le200\),\(1\le K\le N\)。
考虑一个 \(N\times N\) 的网格矩阵 \(A\),主对角线上的 \(N\) 个格子留空。其余所有非对角线格子各放置一颗石子,此时每一列恰好有 \(N-1\) 个石子,每一行也恰好有 \(N-1\) 个石子。(类似于 Ferrers 图的思想。)
将游戏中的 \(N\) 堆石子对应到网格的 \(N\) 列。那么先手和后手的两种操作等价于:
-
先手:在第 \(c\) 列中选出 \(x\) 个有石子的格子 \((r_1,c),(r_2,c),\cdots,(r_x,c)\) 并移走。
-
后手:利用棋盘关于主对角线对称的性质,选择先手操作位置的转置格子:\((c,r_1),(c,r_2),\cdots,(c,r_x)\)。
因此,无论先手怎么操作,后手都可以跟随其行动而进行操作,于是保持了网格关于主对角线的对称性。由于游戏在有限步内终止,因此后手这样做就可以必胜了。
Submission #79802548 - AtCoder Regular Contest 231
E - Odd Inversion
给定一个长度为 \(N\) 的单调不降正整数序列 \(A=(A_1,A_2,\cdots,A_N)\)。
请计算满足以下条件的正整数序列 \(B\) 的数量,对 \(998\,244\,353\) 取模:
- 长度同样为 \(N\),且对所有 \(i=1,2,\cdots,N\) 有 \(1\le B_i\le A_i\);
- \(B\) 的逆序数为奇数。
\(1\le T\le10^4\),\(1\le N\le2\cdot10^5\),\(1\le A_1\le A_2\le\dots\le A_N\le10^9\),\(\sum N\le4\cdot10^5\)。
设逆序数为偶数和奇数的序列 \(B\) 的数量分别为 \(C\) 和 \(D\),由于 \(C+D=\prod A_i\) 是已知的,只需要求出 \(\boldsymbol{C-D}\),即可求出 \(C\) 和 \(D\)。
设 \(X_i\) 表示只考虑前 \(i\) 个位置的 \(C-D\)。首先有 \(X_0=1\),\(X_1=A_i\)。考虑如何递推。
- 如果 \(B_i=B_{i-1}\),则这两项的贡献相等,去掉后逆序对奇偶性不变。由于 \((B_i,B_{i-1})\) 满足 \(B_i=B_{i-1}\) 的共有 \(A_{i-1}\) 种情况,因此 \(X_i\) 加上 \(A_{i-1}X_{i-2}\)。
- 如果 \(B_i\ne B_{i-1}\),分别考虑以下情况:
- 如果 \(B_{i-1}\) 和 \(B_i\) 都不超过 \(A_{i-1}\),那么可以将 \(B_{i-1}\) 和 \(B_i\) 交换,对逆序数的影响为 \(\pm1\),因此奇偶抵消,对 \(C-D\) 没有影响,贡献为 \(0\)。
- 如果 \(B_{i-1}\le A_{i-1}\) 且 \(A_{i-1}<B_i\le A_i\),那么 \(B_i\) 不产生贡献,贡献为 \((A_i-A_{i-1})X_{i-1}\)。
因此有下面的递推式:

浙公网安备 33010602011771号