Codeforces Round 865 (Div. 2)
A
- 判断中间是否有格点,显然就是最大公因数为 1,注意考虑 0 的情况
- 既然能走两步且不用最优,则默认两步,第一步横坐标走到
x - 1
位置(注意 x 等于 1 的情况要特判 2),纵坐标的要求即是与x - 1
互质,第二步因为横坐标相差 1,显然怎么走都没有格点。 - 即考虑一个与
x - 1
(x + 1 当目标坐标为 1 时)互质的数,考虑两个在1e5
范围左右的质数,显然对于 $x \le 1e9$,最多只有包含一个质数
- 看了官方题解,是我脑子抽了,注意到 1 的互质性质,显然可以构造第一步出现一个 1,第二步也出现一个 1,即第一步走
(x - 1, 1)
,第二步走(1, y - 1)
B
此题也是体现了似是而非的贪心的重要性(严格证明的贪心在比赛中没有必要,但一定要有一定道理)
此题考虑到在
(row + col) & 1 == 0
的位置上一定是加法,其余位置减法,要想最大,一定是将较大的数放在(row + col) & 1 == 0
的位置上,较小的数放在其余位置上再注意到此题的要求是使最小值最大,显然是要用平均的思想
所以我们的策略是先将一定会加的位置,即终点和起点赋最大和次大值
再对于位置
(0, i)
和(1, i - 1)
如果是(0, i)
是减法,且(0, i)
减的值多 1,则在(0, i + 1)
位置上(加法),多加 1严格证明或其他构造可以参考官方题解
C
- 看到单调不递减,考虑差分
- 一次操作即是让
pos
位置和pos + 2
位置前增后减或前减后增,显然可以按奇偶分开考虑,加入 0 位置占位利于操作 - 如果 n 为奇数,则加入 0 位置后总位数为偶数,且对于奇数和偶数位置上都有一个可以任意操作位,所以存在
- 如果 n 为偶数,则加入 0 位置后对于偶数位置上的数有两个任意可以操作的位,所以对于偶数显然成立,考虑奇数并贪心,即是前缀和小于等于 0
- 突然发现主流的差分好像是后减前 :)
D
- 很妙的一道题,看了 jiangly 的加边方式才做出来。即考虑加
n
和n + 1
这样所有点就连成了一条链,考虑 $p_1$ 到其他点的距离,距离最远的点即是链的端点。而链的左右端点的情况正好对应题目的两次答案尝试! - 所以分别考虑,求公式即可
细数一下自己犯的 sb 错误
- 加边没看出来
- 逻辑错误,将两种位置搞反,写代码时没认真,且检查代码不仔细
- 推公式太慢
- 数组下标相对位置写错
- 实现硬伤,题解写的很简单,我写的过程异常复杂
E
这是我印象中第一道独立解出的 codeforces 2200 题 :) 具有纪念意义
首先是题目要看懂,注意是出现了 $a_i$ 才出现 $b_i$,反之不然
其次注意到 1 的特殊性,只会出现 1 次
考虑与 1 有关的点,显然最多只能出现 2 次。再考虑到与 1 相关的点且互相相关的点,发现可以都按同一个顺序来排,再将 1 夹在中间则所有条件都满足
再考虑与(与 1 相关的点)相关的点,显然最多出现 3 次,也是将其夹在中间。发现如果此类点如果也与 1 相关,则需要退化为与 1 相关的点
结合以上稍加思考,发现即是求各点到 1 的最短路(因为长路会被退化),长度 + 1 即是出现次数。如果视同样长度为 1 层,写成杨辉三角的包夹形式(即将同样长度的数字按同一个顺序视为一个整体,在 i 层就与上层错位写 i 个)
相邻两层的错位关系即是一定需要的包夹关系,剩下就是找一种方式构造这种包夹关系,发现可以按自左下向右上的斜线添加即可
回顾此题犯的 sb 错误
单向边加成双向边(题目没看清)
用 floyd 跑 1e3 的数据 ??????
且发现数据范围,跑最短路完全可以用 bfs,我却用 dij (虽然也很好写)
用字符表示一个多位数 ????
这也启示自己不要畏难,且做题不要走神 :)