专题题解 - XXII Open Cup, Grand Prix of EDG
打 * 号表示没有写的题,暂时没来得及写。
A. A Hero Named Magnus
难度:$\bigstar$
题目大意:
你和某人进行 BO $n$ 的比赛,前 $x-1$ 局你都可能会输,之后你永远都赢,求 $n$ 的最小值使得你保证获胜。
$1\leq x\leq 2\times 10^9$
题目解法:
显然答案为 $n=2\times x-1$,时间复杂度为 $O(1)$。
1 |
|
B. A Plus B Problem
难度:$\bigstar$
题目大意:
有两个 $n$ 位的可能含前导零的十进制整数 $A,B$,令 $C$ 为它们的和的末 $n$ 位,现在有 $q$ 次操作,每次修改 $A$ 或 $B$ 中的某一位,你需要输出 $C$ 中对应位的新的值,以及三个数中总共有多少数位发生了变化。
$1\leq n,q\leq 10^6$
题目解法:
考虑如何维护进位:维护所有 $A,B$ 对应位的和不为 $9$ 的位,那么一位上有没有进位就取决于上一个和不为 $9$ 的位的和是否 $\ge 10$。
所以我们用 set 维护这些位,就可以 $O(\log n)$ 知道某一位当前是否有前面过来的进位,以及它的进位最多能影响后面多少位。
时间复杂度为 $O((n+q)\log n)$。
1 |
|
*C. AC Automaton
难度:$\bigstar\bigstar\bigstar\bigstar$
D. Assumption is All You Need
难度:$\bigstar\bigstar$
题目大意:
给定 $1,\ldots,n$ 的排列 $A_1,\ldots,A_n$ 和 $B_1,\ldots,B_n$,一次操作可以交换 $A$ 中的一对逆序对,请判断能否通过若干次操作把 $A$ 变成 $B$,如果可以还请构造。
$1\leq n\leq 2021$
题目解法:
考虑依次将 $1,\ldots,n$ 归位。
比如先考虑 $1$,显然 $1$ 只能往前交换,所以 $1$ 交换之后不能到目标位置(它在 $B$ 中位置)的前面,那么我们考虑 $2$,如果 $2$ 在 $A$ 中的位置在 $1$ 之前,而又在 $1$ 的目标位置之后,那么就可以交换 $1,2$。同时,如果在某组解中没有交换 $1,2$ 而是交换了 $1,x (x>2)$,那么这一操作是可以用先交换 $1,2$,再交换 $2,x$ 来代替的,所以先交换 $1,2$ 肯定不会错过可行解(也可以理解成对于其他数来说 $1,2$ 都一样,那么由于 $1$ 还在目标位置左边,那么不如就把 $2$ 尽量往后放)。
同理,再考虑 $1,3$,如果 $3$ 又夹在 $1$ 的当前位置和目标位置中间,就又可以交换 $1,3$,以此类推。
如果某一步中 $x$ 当前位置已经在目标位置左边,那么无解。
时间复杂度为 $O(n^2)$。
1 |
|
E. Buy and Delete
难度:$\bigstar$
题目大意:
给定 $n$ 个点 $m$ 条边的边带权有向图 $G$,边权为正。
记一个子图 $G’$ 的权值 $w(G’)$ 为:最少可以将 $G’$ 中的边拆成多少个 DAG(空图权值为 $0$)。
你需要选择一组边权和不超过 $C$ 的边集,使得其构成的子图权值最大,输出最大的权值。
$1\leq n\leq 2000, 1\leq m\leq 5000$
题目解法:
显然 $w(G’)\leq 2$,因为可以分成 $i
而 $w(G’)=0$ 当且仅当没有边,$w(G’)=1$ 当且仅当 $G’$ 是 DAG。
所以使得 $w(G’)\ge 1$ 的最小边权和是边权的最小值,使得 $w(G’)=2$ 的最小边权和是最小环的边权和。
用 Dijkstra 求最小环即可。
时间复杂度为 $O(nm\log n)$。
1 |
|
F. Illuminations II
难度:$\bigstar\bigstar$
题目大意:
给定一个凸 $n$ 边形和一个凸 $m$ 边形,后者完全包含在前者内部。
随机从 $n$ 边形的内边界选择一个点,求从这个点能看到的 $m$ 边形外边界的部分的长度期望。
$3\leq n,m\leq 2\times 10^5$
题目解法:
从 $n$ 边形上某个点能看到的 $m$ 边形外边界的部分显然是一段连续的边。
根据期望的线性性,转化为求出 $m$ 边形每条边能被 $n$ 边形内边界上多长的一段点看到,只需要求出两个端点即可。
设 $m$ 边形上一条边是 $AB$,我们只需要求出直线 $AB$ 与 $n$ 边形的两个交点即可,不妨考虑射线 $AB$,为了快速对每条边求出这个射线与 $n$ 边形的交点,可以用双指针转一圈,转化为只需要判定射线是否与 $n$ 边形的某条边相交,而这是容易的。
时间复杂度为 $O(n+m)$。
1 |
|
G. Occupy the Cities
难度:$\bigstar$
题目大意:
给定一个长度为 $n$ 的 $\texttt{0,1}$ 串,每一步中任何一个 $\texttt{1}$ 都可以将相邻的某一个 $\texttt{0}$ 也变成 $\texttt{1}$,求最少要多少步才能使得串变成全 $\texttt{1}$。
$1\leq n\leq 10^6$
题目解法:
二分答案,从左往右贪心判定。
时间复杂度为 $O(n\log n)$。
1 |
|
H. Popcount Words
难度:$\bigstar\bigstar\bigstar$
题目大意:
定义 $s_i$ 表示 $\operatorname{popcount}(i)\bmod 2$,令 $w(l,r)$ 表示由 $s_l,\ldots,s_r$ 依次拼接成的字符串。
给定 $n$ 个区间 $[l_i,r_i]$,令 $S$ 是由 $w(l_1,r_1),\ldots,w(l_n,r_n)$ 依次拼接成的字符串。
还有 $q$ 个询问,每个询问给定字符串 $T$,求 $T$ 在 $S$ 中的出现次数。
$1\leq n,q\leq 10^5, 1\leq l_i,r_i\leq 10^9, 1\leq \sum |T|\leq 5\times 10^5$
题目解法:
这里的 $w(l,r)$ 是一个很经典的递归构造的字符串,令 $S(0,0)=\texttt{0}, S(0,1)=\texttt{1}$,然后 $S(i+1,0)=S(i,0)+S(i,1), S(i+1,1)=S(i,1)+S(i,0)$,那么 $w(l,r)$ 就可以拆分成 $O(\log r)$ 个 $S(i,j)$ 的拼接。
所以 $S$ 可以拆分成 $O(n\log V)$ 个 $S(i,j)$ 的拼接,其中 $V$ 是 $l_i,r_i$ 的值域。
建出所有模式串的 AC 自动机,那么我们只需要先预处理出所有 $S(i,j)$(只有 $O(\log V)$ 个)在 AC 自动机上运行的结果(从一个点会跳到哪个点),就可以算出 $S$ 在 AC 自动机上行进的整个过程,而由于 $S(i,j)$ 是递归定义的,所以我们可以用类似倍增的方法算出所有 $f(u,i,j)$ 表示从 AC 自动机上点 $u$ 出发走 $S(i,j)$ 这个串会走到哪里。
然后我们要统计答案,先算出 AC 自动机上每个点经过了几次:由于我们已经可以知道从某个点 $u$ 出发走某个 $S(i,j)$ 走了几次(记为 $g(u,i,j)$),所以我们可以将这个过程再次根据递归结构“分解”,也就是从 $g(u,i,j)$ 递推到 $g(u,0,0)$ 和 $g(u,0,1)$,也就知道每个点走了几次了。
然后再 Fail 树上 DP 一下得到每个串的匹配次数。
时间复杂度为 $O((n+\sum |T|)\log V)$。
1 |
|
I. PTSD
难度:$\bigstar$
题目大意:
给定长度为 $n$ 的 $\texttt{0,1}$ 串 $S$,你要将 $\{1,\ldots,n\}$ 划分成若干个子集,使得所有满足 $S_i=\texttt{1}$ 且 $i$ 在其所属子集中为次大值的 $i$ 之和最大。
$1\leq n\leq 10^6$
题目解法:
从大到小贪心,维护当前还剩几个可以作为最大值的数,如果还有这样的数且当前位为 $1$,就将它们分入一个集合,否则就将当前数也加入可以作为最大值的候选。
时间复杂度为 $O(n)$。
1 |
|
J. Suffix Automaton
难度:$\bigstar\bigstar$
题目大意:
给定字符串 $S$,将所有 $S$ 的本质不同非空子串按长度为第一关键字,字典序为第二关键字排序,$q$ 次询问其中第 $k$ 个子串是什么(输出最前一次出现的左右端点)。
$1\leq |S|,q\leq 10^6$
题目解法:
本题用后缀数组处理更为直观一些。
预处理后缀数组,考虑将 height 数组按值排序,离线询问,三者(询问值,height 值和子串长度)同时从小到大考虑。
假设当前考虑到了长度为 $i$ 的子串,我们维护长度小于 $i$ 的子串数量,还维护所有长度为 $i$ 的不同子串在后缀数组中的首次出现位置,于是我们就只需要快速求出其中的第 $k$ 小,用一个维护第 $k$ 小值的倍增树状数组即可,而求出最前一次出现的左右端点只需要利用一个建立在后缀数组上的查询最小值的 ST 表即可实现。
时间复杂度为 $O((|S|+q)\log |S|)$。
1 |
|
K. Tax
难度:$\bigstar\bigstar\bigstar$
题目大意:
给定一个 $n$ 个点 $m$ 条边的无向图,任意两个点间至多有一条边,每条边有颜色 $c_i$,第 $x$ 次经过颜色 $c_i$ 的边需要支付 $x\times w_i$ 的钱。
对于每个 $i\in [2,n]$,求出从 $1$ 到 $i$ 走一条最短路,至少需要支付多少钱。
$1\leq n\leq 50$
题目解法:
首先求出以 $1$ 出发的最短路 DAG,由于这是分层 DAG,且只有 $50$ 个点,所以可以算出路径数量非常少,直接暴搜即可。
实际上感觉非常不好想。
时间复杂度大约为 $O(3^{\frac{n}{3}})$。
1 |
|
*L. Wiring Engineering
难度:$\bigstar\bigstar\bigstar$