20210705组队赛 题解
20210705组队赛 题解
前言
目前已施工完毕,欢迎阅读!
本题解中略去大部分 题意简述 部分,如需了解题意请阅读原题面。
A - 最大的序列
题目分析
想法 \(1\):我会暴力!
枚举每个数是否取,然后计算和并对 \(m\) 取模,直接二进制为 \(O(n2^n)\),如果写 DFS 边取边统计就是 \(O(2^n)\),期望得分 \(50\) 分。
想法 \(2\):我会折半搜索!
观察到 \(n\le 35\),如果将原数列先拆为两半分别搜索,再通过某种方法进行合并,可以大幅降低复杂度。
设 \(p\) 为由前一半 DFS 得到的和构成的数组 \(A\) 中的一个元素,\(q\) 为由后一半 DFS 得到的和构成的数组 \(B\) 中的一个元素。那么显然有 \(0\le p,q<m\),从而 \(p+q<2m\)。而答案为 \(\max\{(p+q)\mod m\}\),因此我们对 \(p+q\) 进行分类讨论。
-
\(m\le p+q<2m\)
显然 \(p+q\) 越大越好,直接取最大的 \(p\) 和最大的 \(q\) 即可。
-
\(0\le p+q<m\)
两种做法,前提都是两个数组都有序。(此处默认单调不降)
- 二分。枚举 \(A\) 中的元素,二分找到 \(B\) 中最大的元素使得 \(p+q<m\)。时间复杂度为 \(O(n\log_2{n})\)。
- 双指针。由于 \(A\) 中元素单调不降,所以对应的 \(B\) 中的满足 \(p+q<m\) 的最大元素单调不升。因此用另一个指针 \(j\) 从尾到头一遍扫数组 \(B\),即可找到答案。时间复杂度为 \(O(n)\)。
时间复杂度为 \(O(2^{n/2})\),因为统计部分复杂度远比这低。期望得分 \(100\) 分。
代码展示
https://www.luogu.com.cn/paste/ey4ot8x2
提供了两种方法的代码。
B - 礼物
题意简述
一张图,每条边有两个属性 \((g_i, s_i)\) 。给定 \(G, S\),求一棵图的生成树 \(T\),使得 \(G \times \max(g_i) + S \times \max (s_i)\) 最小 \((i\in T)\)。图可能包含重边和自环。
题目分析
最小生成树优化。
如果只有金币怎么做?将金币从小到大排序,直接跑最小生成树即可。
那再加上银币呢?枚举 \(\max(g_i)\),将所有 \(g_i\le \max(g_i)\) 的边抽出跑最小生成树,时间复杂度为 \(O(m^2)\),无法通过此题。
注意到枚举 \(\max(g_i)\) 的过程中,构成最小生成树的边集中只会加入 \(s_i\) 更小的边,删去 \(s_i\) 更大的边。因此我们维护一个边集,边集中的边按照 \(s_i\) 从小到大排序,每次插入一条边。这一过程可以用归并排序实现,时间复杂度为 \(O(mn\log_2n)\)。
这一过程也可以用冒泡排序实现,每加入一条边就从后往前冒泡,以此来维护一个 \(s_i\) 单调不降的边集,时间复杂度为 \(O(mn)\)。
而在每次做最小生成树时,我们需要将加入的边放入新边集,从而满足上述过程的需求。
代码展示
https://www.luogu.com.cn/paste/cczt8pxz
C - Do You Know Your ABCs?
题目分析
码农题。
注意到 \(\text{A,B,C}\) 满足以下关系:
其中 \(\text{C}\) 和 \(\text{A+B}\) 的大小关系不确定。
因此我们将输入的 \(x\) 数组从小到大排序,然后 DFS 枚举一下 \(x\) 数组中的每个值属于原始序列的哪一个。计算时将位置 \(3\) 和 \(4\) 指向的值也算一遍就可以不考虑 \(\text{C}\) 和 \(\text{A+B}\) 的大小关系了。
计算时默认位置 \(3\) 指向 \(\text{C}\) 的值,位置 \(4\) 指向 \(\text{A+B}\) 的值。考虑一下情况:
-
\(\text{A,B,C}\) 的值知道 \(3\) 个。
-
\(\text{A,B,C}\) 的值知道 \(2\) 个。
- 知道 \(\text{A,B}\)。则 \(\text{C}\) 可以通过位置 \(5,6,7\) 上的任意一个值算出来。
- 知道 \(\text{A,C}\)。则 \(\text{B}\) 可以通过位置 \(4,6,7\) 上的任意一个值算出来。
- 知道 \(\text{B,C}\)。则 \(\text{A}\) 可以通过位置 \(4,5,7\) 上的任意一个值算出来。
-
\(\text{A,B,C}\) 的值知道 \(1\) 个。
-
知道 \(\text{A}\)。则 \(\text{B}\) 可以通过位置 \(4\) 直接得到,\(\text{C}\) 可以通过位置 \(5\) 直接得到,若 \(\text{B}\) 和 \(\text{C}\) 已通过上面过程得知一个,可以通过位置 \(6\) 得知另一个。
-
知道 \(\text{B}\)。则 \(\text{A}\) 可以通过位置 \(4\) 直接得到,\(\text{C}\) 可以通过位置 \(6\) 直接得到,若 \(\text{A}\) 和 \(\text{C}\) 已通过上面过程得知一个,可以通过位置 \(5\) 得知另一个。
-
知道 \(\text{C}\)。则 \(\text{A}\) 可以通过位置 \(5\) 直接得到,\(\text{B}\) 可以通过位置 \(6\) 直接得到,若 \(\text{A}\) 和 \(\text{B}\) 已通过上面过程得知一个,可以通过位置 \(4\) 得知另一个。
-
-
\(\text{A,B,C}\) 的值知道 \(0\) 个。
由于 \(4\le n\le 7\),那么位置 \(4,5,6,7\) 的值一定都已确定,直接计算即可。
通过上述方法得知 \(\text{A,B,C}\) 的值后,我们需要将其进行检验:
- 是否满足 \(\text{A}\le \text{B}\le \text{C}\)。
- 是否符合搜索出来对应位置的值。
通过上述步骤就可以解决这道题目了。
代码展示
https://www.luogu.com.cn/paste/t4ilpt85
D - 游戏
题目分析
素数筛法+组合数学+期望。反正没想到,我是数学白痴实锤了。
定义 Key 数为不被区间 \([L,R]\) 内任何其他数整除的数。题目就相当于求所有排列的最后一个 Key 数所在位置的总和。
用线性筛法(欧拉筛),我们预处理出区间内每个数的最小的非 \(1\) 因子 \(\min_x\),则最大的非本身因子 \(\max_x=\dfrac{x}{min_x}\)。如果 \(\max_x<L\),那么 \(x\) 就是 Key 数。若换用埃氏筛,实现更简单,但复杂度更高。
设共有 \(m\) 个 Key 数。
根据期望的性质,期望 \(=\) 概率 \(\times\) 贡献。设 \(p=\) 最后一个 Key 数在位置 \(i\) 的概率。
则有:
\(\begin{aligned}p=&\dfrac{\dbinom{i-1}{m-1}(n-m)!m!}{\dbinom{n}{m}(n-m)!m!}\\=&\dfrac{\dbinom{i-1}{m-1}}{\dbinom{n}{m}}\\=&\dfrac{(i-1)!}{(m-1)!(i-m)!}\times \dfrac{m!(n-m)!}{n!}\\=&\dfrac{m(i-1)!(n-m)!}{(i-m)!n!}\end{aligned}\)
而贡献则为 \(i\times n!\),即位置 \(\times\) 排列数。
那么期望为:
\(\begin{aligned}ans=&\sum\limits_{i=m}^n{(p\times i)}\times n!\\=&\sum\limits_{i=m}^n\Bigg(\dfrac{m(i-1)!(n-m)!}{(i-m)!n!}\times i\Bigg)\times n!\\=&\sum\limits_{i=m}^n\Bigg(\dfrac{i!}{(i-m)!m!}\Bigg)\times m\times m!\times (n-m)!\\=&\sum\limits_{i=m}^n\dbinom{m}{i}\times m\times m!\times (n-m)!\\=&\dbinom{m+1}{n+1}\times m\times m!\times (n-m)!\\=&\dfrac{(n+1)!}{(m+1)!(n-m)!}\times m\times m!\times (n-m)!\\=&\dfrac{m(n+1)!}{m+1}\end{aligned}\)
上面 \(\sum\limits_{i=m}^n\dbinom{m}{i}=\dbinom{m+1}{n+1}\) 的公式推导可以看 这篇题解。
简洁。
代码展示
https://www.luogu.com.cn/paste/817gdgw7
E - 小倍数
题目分析
神仙题,压根想不到。
需要对问题进行转化。每个数都能通过以下两种方式,从 \(1\) 得到。
- \(\times 10\)。这种方法即在原数末尾添一个 \(0\),数位累加和不变,权重为 \(0\)。
- \(+1\)。这种方法数位累加和也会相应 \(+1\),权重为 \(1\)。
然后使用 0-1 BFS 进行搜索,从 \(1\) 开始搜索,将权重为 \(0\) 的放入队首,为 \(1\) 的放入队尾,这样可以保证从队首到队尾的权重单调不减,从而使得找到的为 \(k\) 的倍数的数的权重一定最小。
代码展示
https://www.luogu.com.cn/paste/d87efwud
F - Acowdemia S
题目分析
二分水题。
贪心地想,将引用次数 \(c\) 数组总大到小排序,因此需要填补的引用次数就会尽可能地小,而更加容易满足条件。
直接二分 \(h\),如果贪心填补需要的量超过 \(K\times L\) 或某一篇论文仍需引用的次数大于 \(K\) 即为不可行,否则可行。
时间复杂度为 \(O(n\log_2{n})\),期望得分 \(100\) 分。
代码展示
https://www.luogu.com.cn/paste/xzp7mmkw
G - 云计算
题目分析
权值线段树。反正没弄出来,我是数据结构白痴实锤了。
很容易想到租借要价格递增地进行租借。这个区间有区间覆盖的感觉,但是不容易从中取出最小的 \(k\) 个。
用一种类似扫描线的思想,对于每种计划在 \(L_i\) 处增加 \((val_i,cnt_i)\),在 \(R_i\) 处增加 \((val_i,-cnt_i)\)。具体实现就是将这些二元组按照添加的时间从小到大排序,在对每一天进行操作时对应将这些二元组插入线段树即可。
查询部分用与 K-th number 类似的思想,如果左儿子对应的区间内的所有计划的租用 CPU 的总个数 \(\ge k\),就在左儿子这边查找,否则在右儿子这边查找,然后再加上左儿子这边的总价即可。这被称为线段树上二分。
不会算时间复杂度 qwq
代码展示
https://www.luogu.com.cn/paste/vwhfv6bl
H - Portals
题意简述
给个 \(2n\) 个点,和 \(n\) 个五元组 \((a,b,c,d,e)\),最开始 \(a\) 和 \(b\) 连边,\(c\) 和 \(d\) 连边。对于每个五元组,可以花费 \(e_i\) 的代价将 \(a,b,c,d\) 重新排列,问最小的代价使所有点联通。每个点恰好出现两次。
数据范围:\(2\le n\le 10^5\),\(1\le c_v\le 10^3\)
题目分析
本文引用了 @SharpnessV 的 洛谷题解 中的较多语段。
最小生成树。
原题面长得要命。
抓住重点:每个点恰好出现两次。
这意味着什么?这表示每个点的度数为 \(2\),而连通的图如果每个点的度数为 \(2\),则一定是一个环。如果图不连通,则是若干个环。
而合并这些环,可以用 \(e_i\) 的代价将 \(a_i\) 所在的环和 \(c_i\) 所在的环连通。因此我们只需要将先用并查集维护每个点所在的环,再将环缩成点,每个五元组缩成边,将这样组成的新图跑一遍最小生成树即可。
时间复杂度为 \(O(n\log_2n)\),期望得分 \(100\) 分。
代码展示
https://www.luogu.com.cn/paste/zx48ow5a
I - Two Melodies
题目分析
子段不一定连续且不相交问题,考虑一个 \(O(n^2)\) 的 DP。
设计状态 \(dp[i][j]\),表示第一个序列结尾为 \(i\),第二个序列结尾为 \(j\) 的最大的两个序列长度之和。显然有 \(dp[i][j]=dp[j][i]\),为了防止冲突,我们只枚举 \(i<j\) 的情况,因为当 \(i>j\) 时,我们难以保证第二个序列不与第一个相交。
如果单纯转移,我们还需枚举一维 \(k\),即把 \(a_j\) 接在 \(a_k\) 后面。为了去掉这一维,我们用两个数组 \(\mathrm{mxmod}\) 和 \(\mathrm{mxnum}\) 分别记录当 \(k\in[1,i)\) 时满足 \(a_j\) 和 \(a_k\) 除 \(7\) 同余的最大的 \(dp[i][k]\) 和满足 \(\mathrm{abs}(a_j-a_k)=1\) 的最大的 \(dp[i][k]\),从而顺利实现转移。
边界条件:\(dp[i][j]=dp[i][0]+1\)。
转移方程:\(dp[i][j]=\max(\mathrm{mxmod}[a_j],\mathrm{mxnum}[a_j\pm 1])+1\)
注意在每次转移完后都要继续为下一次的转移更新数组 \(\mathrm{mxmod}\) 和 \(\mathrm{mxnum}\)。注意语句 \(dp[j][i]=dp[i][j]\) 不可丢下。
时间复杂度为 \(O(n^2)\),实际上本题因为清空两个桶数组的原因复杂度会达到 \(O(n\times 10^5)\),但仍能通过本题,我也不知道为什么。
本题采用网络流的做法会更快,直接吊打 DP,但是笔者不会,此处不提。

浙公网安备 33010602011771号