ARC145~152 题解
比赛标号从大到小排列 .
因为博主比较菜所以没有题解的题都是博主不会做的 /youl
ARC144 以前的比赛懒得写了 .
AtCoder Regular Contest 152
B. Pass on Path
长 的道路, 个中转站,两个人每人初始选一个中转站并以至多 的速度行走,两人欲访问道路左右端点 .
两人只能在中转站处相遇,问两人都访问过左右端点后回到她们的初始中转站所需的最少时间 .
, .
C. Pivot
给一个序列 ,每次可以选一个数 然后让所有 都 ( 最后改).
最小化序列最大值 .
.
开局就想错了 /hsh
看到这种诡异操作肯定是想找不变量,观察可以发现序列极差是不变的,令其为 ,于是可以转成最小化序列最小值 .
考虑选最值操作时最小值变化 ,则考虑最小化最小值模 .
令最小值为 ,则如果不操作最值,一次对 的操作将给 带来 的增量,然后操作一次最大值,这个操作还能继续进行,因为最大值 也被带来 的增量 .
然后即可得到 的最小值就是 ,所以原题答案就是 ,直接 计算即可, 是值域 .
D. Halftree
个点 和一个数 ,选若干个点对 ,连边 和 ,要求最后构成一棵树,构造一组方案,无解输出
-1
..
首先 是偶数显然无解,下面说明 是奇数必然有解 .
直接构造,对于每个数 连边 形成 个置换环,将每个置换环中最小的一个放到最前面,这样就可以排成一个 矩阵 .
考虑最后一列单独处理一下,就先连前 列,只需要连 即可,其中 是小于 的奇数 .
这样就整出来 条链,考虑把这些链连起来,连 即可 . 注意这时候我们顺便把最后一列的第一个元素也连了 .
现在最后一列的奇偶性实际上被修正了,这样就可以直接连了,具体构造方案是 .
手玩一个矩阵出来看这个构造方案其实挺直观的,要看图可以去 Official Editorial .
构造的时间复杂度为 (也就是不算求 GCD 的时间复杂度).
AtCoder Regular Contest 151
A. Equal Hamming Distances
给两个 01 串 ,求字典序最小的串 ,使得 ,不存在输出
-1
.为 Hamming Distances,定义为
.
贪心即可,对于 和 的情况限制每种最多选 个 ,显然这种做法是最优方案且符合题意 .
唯一可能产生 -1
的就是 是奇数,判一下就好了 .
时间复杂度 .
B. A < AP
给一个 到 的排列 ,问有多少个序列 满足值在 之间且 ,其中小于号比较字典序,答案对 取模.
, .
注意到字典序,于是枚举 LCP 算贡献 .
枚举一个 ,然后考虑计算对于所有 都有 ,且 时的答案 . 相等可以用一个并查集动态维护,然后并查集的时候维护一下连通块大小即可计算贡献 .
时间复杂度 ,如果使用光速幂代替快速幂即可得到 的时间复杂度 .
C. 01 Game
一个长度为 的序列,每个元素是 或者空,有值的点只有 个 .
Alice 和 Bob 玩一个游戏,每个人每次选一个空点然后染成 或 ,前提是这个点左右点如果有值则值不能相同 .
谁不能行动谁输,问最后谁会赢 .
,,初始相邻两元素值总不相同 .
注意到原游戏为公平组合游戏 / ICG,考虑构建有向图游戏 .
注意到每个极长空连续段即可作为有向图的每个弱连通块,于是根据 SG 定理,算出每个极长空连续段的答案异或起来即可得到整个游戏的 SG 值,于是即可得解 .
断言:
- 若连续段左右两侧都有数,令左右两侧的数分别为 ,则当前 SG 值为 .
- 若连续段有且仅有一侧有数,则当前 SG 值为连续段长度 .
- 若连续段两侧都没有数,则当前 SG 值为连续段长度模 .
证明考虑数学归纳法即可(其实只有单侧有数需要数学归纳法,,)
然后直接扫一遍处理一下即可,时间复杂度 .
D. Binary Representations and Queries
维护一个序列 , 次操作,每次给一个 ,对于所有第 位是 的 ,将 ,操作完后输出整个序列,对 取模 .
, .
首先对于每个 其贡献是独立的,于是可以离线下来对于每个不同的 分别处理对 的贡献 .
不妨令 都等于 ,并且目前的询问次数是 ,其他值类似 .
令 经过 次操作后变成了 ,考虑用矩阵表出转移 .
令 ,,于是就有
其中 是第 次操作的 值 .
展开即得
这样就可以每个均摊 的算出每个元素最后的值了 .
总时间复杂度 ,至少带 的常数,Code .
注:
一般形式应该是
其中 的第 位是 .
E. Keep Being Substring
给一个序列 的两个子序列 .
每次可以将 的开头或末尾插入或删除一个数,但是每一时刻要保证 非空且是 的子序列 .
问让 至少需要多少步 .
.
找到 和 的最长公共子串 ,若 非空那么答案显然就是 ,就是将 先删到 再加回来 .
若 为空,贪心地考虑,则一定是把 删成只剩一个数然后用一些操作让它变成 的子串然后加回去 .
考虑对于所有 ,连边 ,则问题变成 在 和 中分别选两个点 ,使它们之间的最短路最小 .
这个多源汇 BFS 即可,于是问题已经被解决了 .
复杂度瓶颈在求最长公共子串上,如果使用高级做法可以做到 .
如果只用简单字符串算法可以用二分长度 Hash 判定,可以做到 ,足够通过本题了 . 还有这题卡单 Hash,必须双 Hash 才能过,Code .
AtCoder Regular Contest 150
A. Continuous 1
给一个只含 的字符串 ,问是否存在唯一的方案将 换成 或 ,使得 中有且仅有 个 并且它们连续 .
最多 组询问, .
扫一遍,枚举每个长度为 的子串依次判断一下能否成为变完后最终的连续 段即可 .
时间复杂度单次 .
B. Make Divisible
给两个正整数 ,有一个非负整数对 使得 ,问 最小是多少 .
最多 组询问, .
令 ,则 .
于是 仅和 相关,只需要最小化 .
观察可得 的最小值为 .
显然对 整除分块即可 . 时间复杂度 .
或者考虑根号分治,首先编两个暴力(不妨令 ):
- 直接暴力枚举 ,时间复杂度 .
- 从 到 枚举 ,时间复杂度 .
那么把两个暴力拼起来,显而易见 ,当 时取到,于是时间复杂度也是 .
C. Path and Subsequence
有一个 个点 条边的无向连通图 ,还有两个序列 .
问是否对于 中每一条简单路径 ,都有 是 的子序列 .
, .
考虑 DP,令 表示到从点 到点 的所有路径至少匹配 多少位,则
注意到这个转移的形式类似最短路且边权仅为 0, 1,于是使用 01 BFS 即可做到 .
deque<int> q; q.push_back(1);
while (!q.empty())
{
int u = q.front(); q.pop_front();
for (int v : g[u])
{
bool trans = (dp[u] != k) && (a[v] == b[dp[u] + 1]);
if (dp[v] > dp[u] + trans){dp[v] = dp[u] + trans; if (trans) q.push_back(v); else q.push_front(v);}
}
}
D. Removing Gacha
一棵 个点的树,初始所有点都是白的 .
每次随机选一个满足它到根的路径上有至少一个白点的点,然后把它染黑 .
问期望操作多少次让整棵树变成黑的,对 取模 .
.
首先,根据期望线性性可以得到答案就是 ,其中 为第 个点被染黑的期望次数 .
然后问题就变成如何求 了,大概有两种做法:
首先第一种是对于每个点 , 只会被 这条链上的元素贡献到,于是单独提出链来考虑 . 根据 joke3579 大定理我们知道从 个元素的箱子里随机有放回地抽取元素的期望等于从取出第一个元素开始到取出所有元素至少一次时期望抽取次数 .
于是就是经典问题「赠券收集问题」了,抽出一个元素的期望次数即为调和级数 ,然后即可轻易做到 .
这是一个非常精美的构造法 .
第二种方法的话大概就是考虑一个随机过程的期望其实就是任何一个合法的过程前缀 下,元素被选中的概率之和 .
于是令
注意到如果如果 能被染,则要么 的父亲能被染,要么 的父亲不能被染但是在前缀中还没有出现过 .
令 父亲的深度为 ,于是答案是 ,其中
注意到 ,来个 阶差分把组合数干掉即可得到
相对就有点麻烦,因为不能补上 项,考虑用恒等式 降下指标以规约到 ,则
其中 是调和级数 . 倒数第二个等号是用的 的表达式 .
最后深度为 的点的答案就是 ,殊途同归 .
AtCoder Regular Contest 149
A. Repdigit Number
给两个正整数 ,求一个最大的 使得:
- 且 .
- 在十进制下所有数码均相同 .
, .
真带劲,我连这种 naive 题都不会做了……
答案最多有 种,暴力即可 .
B. Two LIS Sum
给两个排列 ,,求置换 使得 最大,只需输出最大的 .
.
断言: 单调递增时 最大 .
考虑 单调增时进行一次交换,这样 的 LIS 必减少 , 的 LIS 至多增加 ,于是新的 必然不优于原来的 .
显然 中被拆的递增段不会再拼起来,否则这些操作都是冗余的,于是上面的思路可以延续下去,即得 单调递增时 最大 .
于是 求一下 即为答案 .
C. Avoid Prime Sum
给一个正整数 ,构造一个 方阵,满足:
- 每个数都是 中互不相同的整数 .
- 任意相邻两数之和不为素数 .
.
不为素数看成为素数了 /qd 结果 ARC C 化身世纪难题 /youl
比较平凡的构造题 .
首先按奇偶考虑,同奇偶的数相加必然是偶数,偶数中只有 是素数,然而两个不同正整数相加不可能等于 ,这样方格上半部分填奇数,下半部分填偶数就大体解决了 .
然后考虑边界处可能出现有和为素数的情况 . 奇偶显然没得分,于是考虑把所有 的倍数都放到边界,这样所有边界处的和都是 的倍数,不可能是素数 .
这样就做完了 . 不过 的倍数数量足够当且仅当 也就是 ,于是 的情况特判一波即可 .
Code, 的情况我是直接贺的 Official Editorial .
D. Simultaneous Sugoroku
给一组点 和一个序列 .
对于每个时刻 ,对每个 ,将 .
次操作后,对于每个点 :
- 若 ,输出
Yes
以及它是第几次操作时第一次变成 的 .- 若 ,输出
No
以及当前的 ., .
这个难度跨度也太大了吧……Difficulty 是 C 的两倍多 /youl
有一个相对无脑的做法,大概就是考虑维护置换 .
注意到任何数到 直接就寄了,考虑维护目前还没寄的区间,每次操作至多把一个区间分裂成两个所以区间数量不超过 .
值域并不大,一开始维护两个区间 和 ,每次操作把正的往左移负的往右移,重叠的用并查集合起来,然后把过 的区间分裂开即可 .
最后对于 个询问看看最初始的 在并查集上的祖先就能得到答案了,时间复杂度大概是 ,其中 是值域 .
代码难度有点高 /hsh 详见 Code,我那份代码调到一半没备份结果电脑关机没磁盘保护导致代码没掉心态崩了决定不再做这个破题 .
官方题解的思路似乎很优美,不过我没看懂 .
E. Sliding Window Sort
对于一个下标从 0 开始的序列 ,对于 ,将 升序排序 .
最后得到的序列即称作 的生成序列 .
现在给一个排列 ,问有多少序列 的生成序列是 ,对 取模 .
, .
好神啊 /bx
进行一下基本的题意转化:
对于一个序列 ,进行以下操作 次:
- 将 从小到大排序 .
- 将序列 向左循环移一位 .
最后得到的序列即称作 的生成序列 .
然后把 向左循环移 位即可 .
问题变成循环移位之后就可以转化成加一个数删一个数这种东西了 .
令序列左边 项为左部 ,剩下的为右部 ,为了方便令 , .
则一次操作就是每次把右部最前面的数加进左部,左部再把最小的数加到右部的末尾(左部经过至少一次操作后必然升序排列) .
观察到:
- 若 ,则显然右边的 个右部元素不会动所以可以直接删了 .
- 若 ,则 次操作之后 必然就是最大的 个数,这样后面的操作就是左部没有变,右部每次向左循环移一位,可以直接批量做了 .
所以所有情况都可以转化到 的情况 .
于是只需要考虑 的情况,注意到这种情况最后的 必然是所有数最大的 个升序排列,于是如果 最左边的数不是所有数中最大的或者不是升序的,那么方案数为 .
令 轮操作后右部为 ,初始左部是 ,右部是 .
如果存在 使得 ,那么必然有 (因为 必然是第 次操作的时候刚进左部就出去了)于是可以删掉这样的 去除影响 .
于是现在的 必然升序排列,则限制可以简单写为 中的一个等于 .
显而易见对于每个 都有 种选法,则根据乘法原理答案就是 ,其中 是最后 的长度 .
另外这个算的左部是有序的,要把它变成无序的,于是答案还得乘一个 .
这样整个问题终于被解决了,时间复杂度 .
附:循环移位有一个叫 std :: rotate
的函数 /hq
AtCoder Regular Contest 148
你题目名还真简洁啊?
A. mod M
给一个序列 ,你可以选一个整数 ,将 的所有元素 .
问操作完后 最少有多少个不同元素 .
, .
普及题啊 .
首先取 可以得到答案不超过 .
答案等于 的时候当且仅当排好序的 差分后的 GCD 不等于 .
然后就 了,要是用飞快的排序和飞快的 GCD 可以优化一下不过没啥用 .
B. dp
以下所有字符串的字符集都是 .
对于串 ,令 为其翻转 后的串,或者说先翻转,然后每个字符 反转 .
现在有一个长度为 的字符串 ,进行至多一次操作:选一个子串 然后把它变成 .
问最后字典序最小的 是啥 .
.
也是普及题 .
数据范围就是明示平方复杂度 .
首先根据字典序定义左端点必然是最左的 ,这样翻转过去之后如果右边有 这个就可以变成 ,否则必然不优 .
于是枚举右端点暴力判即可,时间复杂度 ,用基数排序可以优化到 .
不要尝试线性找右端点,会变得不幸
C. Lights Out on Tree
给一棵 个点的有根树,根是 . 每个节点是黑色或白色,初始都是白色 .
对点 进行一次操作可以将点 的子树(包含自身)全部颜色反转 .
次询问,每次询问给一个点集 ,把点集中的点全部染成黑色,问至少多少次操作可以把整棵树染白 .
.
注意到一个节点最终状态就是它的初始状态异或它到根的路径上被操作节点数量奇偶性 .
于是就是:
- 根如果初始是黑则要操作一次 .
- 如果一对父子初始状态不同,那么下面那个一定要操作一次 .
如果一对父子初始状态同为黑则可以留到父亲的地方操作于是不产生贡献 .
这样直接维护即可,时间复杂度 .
D. mod M Game
给你 个整数 ,Alice 和 Bob 轮流取数,Alice 先手,如果最终 Alice 取出数的和和 Bob 取出来数的和在模 意义下同余,则 Bob 获胜,否则 Alice 获胜,问谁必胜 .
, .
过程倒不难,不过这玩意到底咋想出来的啊??
首先如果序列里有两个数相同,则选的时候必然是一起选的要不然显然不优,于是可以先把问题转化成元素互不相同的情况 .
从最终状态还剩两个数 开始考虑 .
令两人当前取数之差为 ,则 Bob 必胜当且仅当 且 .
也就是 ,移项变成 .
这里可以自然的想到讨论 的奇偶性,当 是奇数是意味着 ,这显然不存在,于是 Alice 必胜 .
只需要讨论 为偶数的情况 . 此时就是 也就是 .
这样的二元组 每出现一个则 增大 ,于是这样的组的数量必然是偶数 .
则可以猜想:Bob 必胜当且仅当剩下的数之和为 的倍数且可以通过以上配对规则两两配对 .
证明就考虑构造一个方案,具体见 Official Editorial .
时间复杂度 或 ,瓶颈在去重 .
E. ≥ K
给一个序列 ,求它有多少种不同的排列满足对于所有 有 .
.
预设型 DP .
必然先排序,然后从小到大加入 . 考虑一个数前,先把与它满足条件的点都加入,这样就可以快速计算那些地方能放数了 .
具体的,维护当前的闲置区间 ,那么可以发现如果 就插入 ,否则插入 ,则对于 这些数的旁边都可以放,别的都不行,这样就可以直接算了 .
时间复杂度 ,瓶颈在排序 .
F. 998244353 → 1000000007
有 个变量 ,最多 次操作:
add x y z
, .mul x y z
, .rem x y
, .现在 处给你存了两个数 ,其他地方都是 . 你的任务是在 处算出 .
.
造计算机 + 科技题 .
使用 Montgomery Multiplication 算法解决,具体看官方题解 .
一个方案(贺的):
26
mul C A B
rem D C
mul D D 4915446
rem D D
mul D D 1000000007
add D C D
mul C D 996491785301655553
mul C C 343639189
rem D C
mul D D 4915446
rem D D
mul D D 1000000007
add D C D
mul C D 996491785301655553
rem D C
mul D D 4915446
rem D D
mul D D 1000000007
add D C D
mul C D 996491785301655553
rem D C
mul D D 4915446
rem D D
mul D D 1000000007
add D C D
mul C D 996491785301655553
AtCoder Regular Contest 147
A. Max Mod Min
一个序列 ,每次把最大值模上最小值,然后删掉序列里所有 .
问多少轮后序列只剩一个元素 .
, .
根据辗转相除法的经典结论暴力即可 . 时间复杂度其实能分析小点,大概和下面那个做法的分析差不多吧 .
题解做法好牛逼啊,注意到最大值模最小值一定是新最小值,于是双端队列维护,时间复杂度 , 是值域 .
B. Swap to Sort
给一个排列 .
操作:
- A:选一个整数 ,然后交换 .
- B:选一个整数 ,然后交换 .
进行不超过 次操作将序列排序,要求 A 操作数量最小,构造一组方案 .
.
咋感觉是 CF 原题 .
挺水的,B 操作只会影响下标奇偶性相同的数 .
于是排名和下标奇偶性相同的就可以直接用 B 换过去,如果不然则用一个 A 换即可,注意这个 A 要求是排名和下标奇偶性不同,这样可以省次数 .
时间复杂度 ,总操作次数的一个松上界是 次,算出来是 ,小于 ,可以通过 .
C. Min Diff Sum
给 个区间 ,每个区间选一个点 ,最小化
.
一个歪解:考虑选出一个点,之后令所选的点尽可能靠近所选点,这样答案是单峰的,不过可能有几段的值都是相等的,不能三分,需要模拟退火,不过一轮模拟大概是 到 ,这样模拟退火复杂度不对,谁有基于这个的更高明的做法可以评论区发一下来教育博主 :<
正解还挺牛逼的:
令 ,则如果 那么直接对于每个 选一个 即可 .
若不然,则令 .
根据观察可以得到对于所有 都有 ,否则可以调整得到更优的解 .
于是
其中 的意思是 .
于是问题变成求解 这个子问题了,于是分治即可 .
将 作为两维独立考虑,则 降序排序, 升序排序后,答案就是
直接算即可,时间复杂度 .
D. Sets Scores
有 个集合,,每个集合 要求:
- 每个元素是不大于 的正整数 .
- 相邻两个集合之中,有且仅有一个不同的数 .
定义 的分数为 其中 为 在 中出现的次数之和 .
问所有满足条件的 的分数和,对 取模 .
.
好强……
令 表示 和 相差的那个不同的数,则如果确定了 和 即可确定全部的 .
令 表示对于所有 , 的个数, 表示 ,对于 , 的个数,那么选择 的方案数就是 .
观察可见 ,于是方案其实就是 .
然后 显然就只有 种选法,于是乘起来就得到答案是 ,快速幂解决,时间复杂度 .
E. Examination
有 个学生,第 个人需要得到至少 分,但是目前只有 分 .
你可以任意地交换两个学生的分数,以使得所有学生都能得到她需要的分数 .
求最多能在多少学生不与别人交换分数的情况下,使得所有学生都能得到她需要的分数。无解输出
-1
..
令 表示有多少个 满足 ,类似的, 表示有多少个 满足 .
令 ,则若 就不合法 .
然后贪心换即可,不太想写,具体细节见 Official Editorial . 时间复杂度 .
AtCoder Regular Contest 146
A. Three Cards
个正整数,找三个数拼起来让数最大 .
,每个数小于 .
普及贪心题 .
B. Plus and AND
给一个序列 ,选不超过 个元素给它加一,最后选 个数,问 AND 最大是多少 .
, .
原来是弱智贪心题,原来我是弱智 .
由贪心可知 AND 为 1 的位肯定越高越好,所以从高到低扫一遍算一下将其变为 1 所需要的最小次数大概就这样即可,其实等价于一个 binary-search .
然后算完之后排个序取最大的 个即可 . 时间复杂度大概是 , 是值域 .
C. Even XOR
问有多少集合 满足其所有偶数大小非空子集的异或和不为 ,答案对 取模 .
.
发现 APJ 发题解了,那么引个流 APJ 题解,写的比我好建议看 APJ 的题解 .
APJifengc 第一小定理:
满足其所有非空子集的异或和不为 的集合 的数量为
证明:见 各种小定理 .
这样就解决了没有奇数限制的问题 .
有限制的也差不多,注意到如果两个大小为奇数的集合 异或和相等,则 是一个大小为偶数的异或和为 的集合,不符题意,于是所有大小为奇数的集合异或和均不同 .
于是根据 APJifengc 第一小定理的类似推导即可得到答案就是
corner case 省略 .
APJ 的另一个推法是考虑对于序列 构造基底 ,这样显然是一组合法解 .
于是第 步的时候有 个数,也就有 个基底,这样就表明把 APJifengc 第一小定理的 改成 即可,完整式子同上 .
Classical 做法见 Official Editorial .
D. >=<
构造一个长度为 每个数在 之间的整数序列 ,最小化其中所有数之和 . 不存在输出
-1
.序列 有 个约束,每个约束形如一个四元组 ,限制着序列 必须满足下面三者之一:
- 且 .
- 且 .
- 且 .
.
???
原限制等价于 .
每个限制挂点上,然后排个序按 BFS 序 chkmax 更新即可 .
时间复杂度大概是 .
AtCoder Regular Contest 145
A. AB Palindrome
给一个长度为 仅含 的字符串,每次可以把一个长度为 的子串改成 ,问能否把它改成回文串 .
.
修改出来肯定是形如 或者 ,观察可知,串串的开头是 或者末尾是 即可,一个特殊情况 特判一下就可以了 .
B. AB Game
Alice 和 Bob 在取石子,总共 个石子,Alice 每次取 的倍数个,Bob 每次取 的倍数个,去不了的输 .
给 ,问对于 ,有多少个情况 Alice 必胜 .
.
观察可知 Alice 取的越多越好,于是 Alice 必胜当且仅当 且 .
计数的话首先用一个前缀和拆了 这个限制,然后 这个就随便做了 .
算出来 的答案是 ,直接算时间复杂度 .
C. Split and Maximize
一个排列 两个不交子序列 的得分为 ,排列得分为其所有划分得分之最大值 .
对所有排列 ,求得分取到最大值的排列数量 .
观察样例可以发现,划分 这种配对方式一定取到最大的 . 证明就打乱两项试试,或者直接用排序不等式的结论 .
对于每个排列要保证子序列的顺序,则配对方案是 Catalan 数 ,决定划分的顺序方案数是 ,而总共有 种初始排列,则答案为 .
可以 或 计算 .
D. Non Arithmetic Progression Set
构造一个大小为 的集合,使得集合内元素之和为 ,且任意三项不构成等差数列 . 集合元素的值域限制为 .
, .
其实不构成等差数列就是任意 满足 .
根据观察只需要构造 在三进制下仅含 .
这样贪一下即可,为了省值域可以全局平移一下 .
以下是博客签名,正文无关
本文来自博客园,作者:yspm,转载请注明原文链接:https://www.cnblogs.com/CDOI-24374/p/16965800.html
版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0)进行许可。看完如果觉得有用请点个赞吧 QwQ
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)