Codesecrof 350 记录
目录
- 综述
- C Bombs / 炸弹
- D Looking for Owls / 寻找猫头鹰
- E Wrong Floyd / 错误的弗洛伊德
综述
Codeforces 350 是一套有点老的 Div.2,难度为 \(1200-1500-1600-2400-2200\)(其实没那么高)。
C Bombs / 炸弹
题目描述
平面直角坐标系上有 \(n\) 颗炸弹,在 \((0,0)\) 有一个拆弹机器人,它可以执行以下操作,问拆除完毕所需的最小操作数和一组方案。
- 上下左右移动若干步,不能越过炸弹
- 拿起自己所在位置上的炸弹(如有)
- 把自己正拿着的炸弹拆除(如有,且在 \((0,0)\) 位置)
\(n\le 10^5\)。
解题思路
注意到,将炸弹按到原点的曼哈顿距离排序后依次拆除就是对的。
D Looking for Owls / 寻找猫头鹰
题目描述
给定 \(n\) 条线段和 \(m\) 个圆,定义一个“猫头鹰”是满足以下四个条件的一条线段和两个圆的集合。请找出图上不同“猫头鹰”的数量。
- 两个圆半径相等
- 两个圆没有交点
- 两个圆关于线段对称
- 两个圆圆心的连线和线段有交点
\(n\le 3\cdot 10^5\),\(m\le 1500\)。
解题思路
先枚举两个圆,判掉前两个条件,将合法的连心线中点和中垂线存下来。接着,将线段按照所在直线分类,对于每一类考虑每条线覆盖了哪些连心线中点,这可以二维数点做。
E Wrong Floyd / 错误的弗洛伊德
题目描述
有一段错误的 Floyd 求全源最短路的代码,给定代码中 \(n,m,k,a[]\) 的取值,要求构造一组数据使得代码发生答案错误。
input(n,m,k,a[])
for w 1 -> k:
let p = a[w]
for u 1 -> n:
for v 1 -> n:
d[u][v] = min(d[u][v], d[u][p] + d[p][v])
解题思路
不难发现,上面这段代码会出错是因为它只更新经过 \(a[]\) 点的路径。因此,可以选两个点使其最段路为 \(2\),且路径中点不在 \(a\) 内。剩下的边随便连。
本文来自博客园,作者:cwkapn,转载请注明原文链接:https://www.cnblogs.com/cwkapn/p/19110839


浙公网安备 33010602011771号