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\) 种插入方式。因此:

\[ans = \sum\limits_{i=0}^{\frac{n}{4}} \binom{n-2i}{2i} \times (2i-1)!! \times 2^i \times f_{n-4i} \]

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;要求最大,从左到右,如果是 0100 就先放。

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})\)

posted @ 2023-04-16 21:19  zltzlt  阅读(137)  评论(0)    收藏  举报