前言
很幸运地拿到了 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,qleq 10^5),(k=10)。
题解
根据题意暴力对每棵线段树操作即可。时间复杂度 (O(k(n+q)log n))。
Problem C 不正方形
题面
给 $n$ 个红点,$m$ 个蓝点,问是否存在一个凸四边形使得相对顶点颜色相同。(n,mleq 250,x_i,y_ileq 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,yleq 10^{12}),矩阵边长 (d) 不超过 (50)。
题解
首先观察到性质:第 $i$ 次染上的点的 $x,y$ 坐标之和一定是 $2i$,证明可以使用归纳法。因此,染色的过程就是向右上一层一层撒点的过程。
注意到两个中恰好一个的条件可以看作奇偶性,于是我们直接转化条件为 ((x,y)) 的权值等于 ((x-2,y)) 和 ((x-1,y-1)) 的权值和,求每个位置的权值和奇偶性。
不难发现这样就是一个杨辉三角,即求组合数奇偶性了,我们可以使用卢卡斯定理或者一个经典结论完成。
时间复杂度 (d^2) 或 (d^2log(x+y))。
Problem F CTF
题面
你在前 $2^1$ 天会每天写 $1$ 题,接下来 $2^2$ 天每天写 $2$ 题,接下来 $2^3$ 天每天写 $3$ 题,以此类推,问你前 $n$ 天会写多少题。(nleq 10^7)。
题解
考虑直接暴力枚举每天写 $i$ 题的日子为 $[l_i,r_i]$,和 $[1,n]$ 取交集加入答案,当 $l_i>n$ 时直接跳出即可。时间复杂度 (O(log n))。
Problem G 希望
题面
有两棵 $n$ 个点的树,编号都为 $1sim n$,随机一个排列 $p$,将 $i$ 与 $p_i$ 连边,求长度为 $m$ 的简单环的数量的期望,保留四位小数。(nleq 300),(3leq mleq 7)。
题解
显然环一定形如从 $x$ 走树边到 $y$,走 $i o p_i$ 的边到 $p_y$,走树边到 $p_x$,走 $p_i o i$ 的边回到 $x$,因为每个环出现的概率都是 $frac{2}{n(n-1)}$,于是数环的数量即可。于是直接枚举四个点就可以算这个环是否合法了,预处理两点之间距离后时间复杂度为 (O(n^4)),不能通过。
事实上两步枚举可以分开,预处理两棵树上距离为 (d) 的路径的数量即可。
时间复杂度 (O(n^2))。
Problem H 只有小A受伤的世界完成了
题面
一条直线上有 $n$ 个点,所有点对之间连边,一开始所有边从左向右连。有 (m) 次操作,每次给出一条线段,如果两个点都在线段内就反转这两个点之间的边的方向。
问所有操作结束后存在几个有向三元环。
(n,mleq 10^5),(a_ileq 10^9)。
题解
对于三个点 $(x,y,z)$,它们不能形成三元环当且仅当某两个点向第三个点连边的方向相等 。所以枚举 (x),求出 (y,z) 向 (x) 连边方向相同的点对数量即可,这个问题可以使用线段树加扫描线维护。
时间复杂度 (O(mlog n))。
Problem I 排队队
题面
有 $n$ 个人,每个人有属性 $a_i,p_i,q_i$。将 (n) 个人排队,如果一个人前面的人和他的 (a_i) 一样就有 (p_i) 的贡献,不然就有 (q_i) 的贡献,问所有人的贡献之和的最大值。
(n,a_ileq 5 imes 10^5),(p_i,q_ileq 2000)。
题解
先考虑每个人和前面的 $a_i$ 都一样,这样显然是 $sum p_i$ 的贡献。然后考虑将若干个 (p_i<q_i) 的人进行调整,使他们的 (a_i) 和前面的人相同并更新贡献。
当 (a_i=x) 的 (i) 的数量超过 (frac{n}{2}) 时,需要一些技巧来处理细节。
时间复杂度 (O(nlog n))。
Problem J 抽奖
题面
你有 $x$ 个原石和 $0$ 个星辉,每 $160$ 个原石或者 $5$ 个星辉可以抽一发,每抽 $10$ 发会得到 $3$ 个星辉,问你能抽多少发。(xle 10^8)。
题解
先把原石全抽完,最后不断抽完星辉再根据累计抽奖数量更新星辉数量即可。显然你的星辉数量每次以对数级减少。
时间复杂度 (O(log x))。
Problem K 树
题面
给你一个有边权的树,求一个字典序最小的排列 $p$ 满足 $sum _{i=1}^ndis_{i,p_i}$ 最大,输出答案和排列。数据范围 (n le 10^5)。
题解
一个显然的上限是对于每条边 $(u,v,w)$,那么这条边的贡献最大是 $w imes t$,其中 $t$ 为这条边两边的点数的最小值,并且不难直接构造出一个排列满足条件,但是此题要求字典序最小。找出数的重心并且以其为根,定义一个数 (u) 的颜色 (c_u) 表示 (u) 的深度最小且不为根的祖先,特别的有 (c_{rt}=rt),那么显然不能有 (c_{p_i}=c_i(i e rt)),并且满足上述条件即可取到最大值(显然)。
那么就先贪心的取数,一开始可以直接随便选,当取到一种颜色需要删掉的次数等于别的颜色需要删掉的次数(每个点要删两次)的时候就不能随便选了,必须要一一对应,否则就会出现上述矛盾的情况,删除等操作使用一些简单的数据结构和 dfs 序维护即可,细节较多。