CodeForces vp / contest 记录
Codeforces Round 819 (Div. 1 + Div. 2) and Grimoire of Code Annual Contest 2022
赛时以 \(8\) 发罚时的好成绩通过了 \(\text{A} \sim \text{D}\),\(\text{E}\) 差一步想出来,大概得了个 Rank 681, Performance 2098
,实在拉跨。
A
可以操作 \([1,n]\),也可以操作 \([1,i]\) 或 \([i,n]\)。几种情况取个最大值即可。
B
若 \(m < n\) 则无解,否则前面一直填 \(1\),最后 \(1/2\) 位填剩的即可。
C
暴力合并即可,注意只用合并到高度一样的前两个。
D
这题 \(5\) 发罚时……
先随便搞一棵生成树,如果多余的边不形成环,就是树边涂 \(0\),非树边涂 \(1\) 即可。
否则找一个非树边连的链上的点,满足它与链的某个端点相邻,交换它们的颜色即可。
E
其实是简单题,但是搞了好久……
打表后可以简单证明排列只可能存在长度为 \(1,2,4\) 的置换环,并且长度为 \(4\) 的置换环满足环上距离为 \(2\) 的点权差为 \(1\)。
考虑计数。先把长度为 \(1,2\) 的答案搞出来,设一个 \(f_n\) 表示只考虑长度为 \(1,2\) 的环的答案,则 \(f_n = f_{n-1} + (n-1)f_{n-2}\),然后考虑 \(4\) 的答案。
由于 \(4\) 是由两个 \(2\) 拼起来的,不妨枚举选了 \(2i\) 个 \(2\) 段。这个的方案相当于把 \(n-2i+1\) 个物品分成 \(2i+1\) 段,因此方案数为 \(\binom{n-2i}{2i}\)。
这时候 \(2i\) 个 \(2\) 段要两两配对,并且每对都有 \(2\) 种插入方式。因此:
G
\(O(n)\) 做法感觉其实挺简单的。
考虑发现一些性质。
性质 1: 设最后所有的人变成 \(t\),则 \(t > \max\)。
性质 2: 对于所有 \((x,1)\ (x < t)\) 最多只有一个相同的,因为如果有多个,后一个会比前一个大。
性质 3: \(t = \min + n - 1\)。
因此所有的 \((t,1)\) 顺序任意。按权值从大到小考虑,所有 \((x,0)\) 后面恰好有 \(t - x\) 个数比它小,所有 \((x,1)\) 后面恰好有 \(x - \min\) 个数不大于它。如果不够分配就无解,否则这些限制 基本 能唯一确定一个排列,再乘上 \((x,0)\) 内部的排列顺序作为系数即可。
Nebius Welcome Round (Div. 1 + Div. 2)
vp 时降智了,简单贪心调了好久……最后是 Rank 1084, Performance 1902
。
A
先走 \(\min(a,b)\),多的部分停一次再走。
B
每次接种的人是一段区间,双指针即可。
C
猜了个结论,枚举到 \(\min(10n,p)\),然后过了。
D
考虑贪心。要求最小,肯定是 11
更优,之后是 01
,之后是 00
;要求最大,从左到右,如果是 01
或 00
就先放。
E
考虑如果有解,那么一定存在每个点到环的距离 \(\le 1\) 的解。暴力找环即可。
具体而言,设 \(f_{S,i,j}\) 为起点为 \(i\),终点为 \(j\),经过的点集为 \(S\) 的链是否存在,之后枚举 \(S,i,j\),判断 \(i,j\) 是否有边即可,这样是 \(O(n^32^n)\) 的。注意到环上起点任意,因此钦定编号最小的点为起点,就能做到 \(O(n^22^n)\)。
F
搞笑题。
设图的直径为 \(d\),考虑随便取一个点 \(u\) BFS 一遍,求出的最大距离 \(r\) 满足 \(d \le 2r\)。证明是设直径两端点分别为 \(i,j\),显然 \(dis(u,i) + dis(u,j) \ge dis(i,j)\),那么 \(2r \ge d\)。
由于题目只要求毛估估,所以对于每张图直接输出 \(r\) 即可,其中此时的 \(r\) 小于上一次的一半就要重新求一遍。每次二分右端点即可。
CodeTON Round 4 (Div. 1 + Div. 2, Rated, Prizes!)
赛时降智了,10 发罚时过 A~E,还 fst 了。最后是 Rank 669, Performance 2074
。
A
判断是否存在 \(i\) 使得 \(a_i \le i\) 即可。
B
二进制分解即可,填 \(0\) 就相当于依次进行 2,1
操作。
C
先删掉所有重复的数,最后枚举保留几个数即可。
D
显然每条信息能得到的是 \(h\) 的范围,解不等式即可。
E
考虑从小到大进行并查集。每次如果一个点合并成功了,就继续往它的邻居合并。
使用启发式合并,复杂度 \(O(n \log^2 n)\)。
F
考虑如果答案为 \(x\),则第 \(i\) 个叶子的深度最优是 \(x - a_i\)。一层的 \(m\) 个结点要向上占用一个结点,所以最后合并到只剩一个叶子的时候深度不能小于 \(0\)。
也就是:\(\sum\limits_{i=1}^n m^{a_i} \le m^x\)
即:\(x = \left\lceil\log_{m}{\sum\limits_{i=1}^n m^{a_i}}\right\rceil\)。
也就是说我们要维护 \(\sum\limits_{i=1}^n m^{a_i}\),使用线段树维护大数即可。
Educational Codeforces Round 143 (Rated for Div. 2)
赛时卡 F 了,后来发现正解其实很简单……得了个 Rank 26, Performance 2461
。
A
枚举即可。
B
显然造成正贡献的线段只有包含 \(k\) 的,差分即可。
C
对于每个 \(a_i\) 计算它能贡献到的最远的位置即可。
D
显然对于每个连通块,染色的情况是互补的。统计 \(\max\) 的方案,最后乘一个 \(\binom{\frac{n}{6}}{\frac{n}{3}}\) 即可。
E
考虑设 \(f_i\) 为 \(i\) 爆炸后左侧造成的伤害,\(g_i\) 为右侧。
对于 \(f_i\),找到第一个 \(a_j - j \le a_i - i\) 的 \(j\)(若不存在则为 \(0\)),那么 \(f_i\) 可以从 \(f_j\) 转移。
最后枚举爆炸中心取个 \(\min\) 即可。
F
考虑二分答案,这样能知道每个点需要走的步数。
对于一次 dfs
,贪心地自底向上考虑,如果 \(u\) 向下走不行,那么就转移到父节点;如果父节点被染黑了或父节点不存在,就不行。
G
令 \(d_u = deg_u - a_u\),可以发现删点的过程相当于拓扑排序。
先任意求出一个拓扑序,如果对于原图的一条边 \((u,v)\),\(u\) 出现在 \(v\) 前面,那么连一条边 \(u \to v\)。容易证明要统计的即为新图上的不可到达的点对数。
容斥后转化为统计可达点对。分块 bitset
即可。设一个块长 \(B=10^3\),每次统计 \([iB+1, (i+1)B]\) 中的点能到达哪些点。时间复杂度 \(O(\frac{n^2}{w})\),空间复杂度 \(O(\frac{nB}{w})\)