Loading

第二届全国大学生算法设计与编程挑战赛(秋季赛)正式赛题解&比赛回顾

前言

很幸运地拿到了 rank 1!感谢主办方老板(

这次 rank 1 就是实力碾压了,队友负责写牛逼题我负责写傻逼题。

比赛回顾

咕咕咕

题解

题解会尽量照顾到所有水平的选手,会很通俗易懂

这次有些题是队友写的,于是我给的题解不一定描述的很清楚,这里给出甩锅名单,看不懂请找做这个题的人。

ACEFG by me
DHI by shygo_cmll01
BJK by pigstd

如果我没更新记得私信/QQ催我!

Overall

题目编号 A B C D E F G H I J K
思维难度 8 1 2 0 2 0 3 3 4 0 6
实现难度 8 2 3 2 1 0 2 3 4 0 8

所有难度均从 \(0\)\(10\) 打分。

Problem A 分组

重题 Codeforces 755G。

值得一提的是这里开大数据范围卡掉了倍增 FFT 的垃圾做法。

代码

Problem B 二进制

题面 你需要维护 $k$ 棵线段树,支持其中一个子集的区间加和查询一个子集的区间和之和。

\(n,q\leq 10^5\)\(k=10\)

题解 根据题意暴力对每棵线段树操作即可。

时间复杂度 \(O(k(n+q)\log n)\)

代码

Problem C 不正方形

题面 给 $n$ 个红点,$m$ 个蓝点,问是否存在一个凸四边形使得相对顶点颜色相同。

\(n,m\leq 250,x_i,y_i\leq 10^7\)

题解 问题等价于是否存在一条红点之间的线和蓝点之间的线相交。

暴力判断的时间复杂度为 \(O(n^2m^2)\),不能通过。

考虑如果某条红点组成的线和蓝点组成的线有交,显然红点组成的线和蓝点组成的凸包有交。

而如果红点组成的线和蓝点组成的凸包有交,显然红点组成的线和蓝点组成的线也一定有交。

直接每条线和凸包求交即可。

时间复杂度为 \(O(n^2m)\),可以通过一些技巧优化。

代码

Problem D 分配颜色

题面 有 $n$ 行 $m$ 列矩阵,$p$ 次将任意行取反,$q$ 次将任意列取反,问最后共 $t$ 个元素被取反的方案数量有多少,对一个非质数取模。
题解 考虑通过 dp 算出用 $i$ 个操作将 $j$ 行/列取反的方案数,最后枚举取反的行数和列数即可。

时间复杂度 \(O(np+mq+nm)\)

代码

Problem E 土地规划

题面 有一个二维平面,第 $1$ 时刻 $(0,0)$ 会变成红色。

对于之后的每个偶数时刻,如果存在 \((x-2,y)\)\((x-1,y-1)\) 一个染红色,一个没有染色,\((x,y)\) 就会被染成蓝色。

对于之后的每个奇数时刻,如果存在 \((x-2,y)\)\((x-1,y-1)\) 一个染蓝色,一个没有染色,\((x,y)\) 就会被染成红色。

\(T\) 个时刻后某个矩形中的所有点的颜色。

\(T,x,y\leq 10^{12}\),矩阵边长 \(d\) 不超过 \(50\)

题解 首先观察到性质:第 $i$ 次染上的点的 $x,y$ 坐标之和一定是 $2i$,证明可以使用归纳法。

因此,染色的过程就是向右上一层一层撒点的过程。

注意到两个中恰好一个的条件可以看作奇偶性,于是我们直接转化条件为 \((x,y)\) 的权值等于 \((x-2,y)\)\((x-1,y-1)\) 的权值和,求每个位置的权值和奇偶性。

不难发现这样就是一个杨辉三角,即求组合数奇偶性了,我们可以使用卢卡斯定理或者一个经典结论完成。

时间复杂度 \(d^2\)\(d^2\log(x+y)\)

代码

Problem F CTF

题面 你在前 $2^1$ 天会每天写 $1$ 题,接下来 $2^2$ 天每天写 $2$ 题,接下来 $2^3$ 天每天写 $3$ 题,以此类推,问你前 $n$ 天会写多少题。

\(n\leq 10^7\)

题解 考虑直接暴力枚举每天写 $i$ 题的日子为 $[l_i,r_i]$,和 $[1,n]$ 取交集加入答案,当 $l_i>n$ 时直接跳出即可。

时间复杂度 \(O(\log n)\)

代码

Problem G 希望

题面 有两棵 $n$ 个点的树,编号都为 $1\sim n$,随机一个排列 $p$,将 $i$ 与 $p_i$ 连边,求长度为 $m$ 的简单环的数量的期望,保留四位小数。

\(n\leq 300\)\(3\leq m\leq 7\)

题解 显然环一定形如从 $x$ 走树边到 $y$,走 $i\to p_i$ 的边到 $p_y$,走树边到 $p_x$,走 $p_i\to i$ 的边回到 $x$,因为每个环出现的概率都是 $\frac{2}{n(n-1)}$,于是数环的数量即可。

于是直接枚举四个点就可以算这个环是否合法了,预处理两点之间距离后时间复杂度为 \(O(n^4)\),不能通过。

事实上两步枚举可以分开,预处理两棵树上距离为 \(d\) 的路径的数量即可。

时间复杂度 \(O(n^2)\)

代码

Problem H 只有小A受伤的世界完成了

题面 一条直线上有 $n$ 个点,所有点对之间连边,一开始所有边从左向右连。

\(m\) 次操作,每次给出一条线段,如果两个点都在线段内就反转这两个点之间的边的方向。

问所有操作结束后存在几个有向三元环。

\(n,m\leq 10^5\)\(a_i\leq 10^9\)

题解 对于三个点 $(x,y,z)$,它们不能形成三元环当且仅当某两个点向第三个点连边的方向相等 。

所以枚举 \(x\),求出 \(y,z\)\(x\) 连边方向相同的点对数量即可,这个问题可以使用线段树加扫描线维护。

时间复杂度 \(O(m\log n)\)

代码

Problem I 排队队

题面 有 $n$ 个人,每个人有属性 $a_i,p_i,q_i$。

\(n\) 个人排队,如果一个人前面的人和他的 \(a_i\) 一样就有 \(p_i\) 的贡献,不然就有 \(q_i\) 的贡献,问所有人的贡献之和的最大值。

\(n,a_i\leq 5\times 10^5\)\(p_i,q_i\leq 2000\)

题解 先考虑每个人和前面的 $a_i$ 都一样,这样显然是 $\sum p_i$ 的贡献。

然后考虑将若干个 \(p_i<q_i\) 的人进行调整,使他们的 \(a_i\) 和前面的人相同并更新贡献。

\(a_i=x\)\(i\) 的数量超过 \(\frac{n}{2}\) 时,需要一些技巧来处理细节。

时间复杂度 \(O(n\log n)\)

代码

Problem J 抽奖

题面 你有 $x$ 个原石和 $0$ 个星辉,每 $160$ 个原石或者 $5$ 个星辉可以抽一发,每抽 $10$ 发会得到 $3$ 个星辉,问你能抽多少发。

\(x\le 10^8\)

题解 先把原石全抽完,最后不断抽完星辉再根据累计抽奖数量更新星辉数量即可。

显然你的星辉数量每次以对数级减少。

时间复杂度 \(O(\log x)\)

代码

Problem K 树

题面 给你一个有边权的树,求一个字典序最小的排列 $p$ 满足 $\sum _{i=1}^ndis_{i,p_i}$ 最大,输出答案和排列。

数据范围 \(n \le 10^5\)

题解 一个显然的上限是对于每条边 $(u,v,w)$,那么这条边的贡献最大是 $w \times t$,其中 $t$ 为这条边两边的点数的最小值,并且不难直接构造出一个排列满足条件,但是此题要求字典序最小。

找出数的重心并且以其为根,定义一个数 \(u\) 的颜色 \(c_u\) 表示 \(u\) 的深度最小且不为根的祖先,特别的有 \(c_{rt}=rt\),那么显然不能有 \(c_{p_i}=c_i(i \ne rt)\),并且满足上述条件即可取到最大值(显然)。

那么就先贪心的取数,一开始可以直接随便选,当取到一种颜色需要删掉的次数等于别的颜色需要删掉的次数(每个点要删两次)的时候就不能随便选了,必须要一一对应,否则就会出现上述矛盾的情况,删除等操作使用一些简单的数据结构和 dfs 序维护即可,细节较多。

代码

posted @ 2021-10-24 17:27  dXqwq  阅读(1819)  评论(0编辑  收藏  举报