Codeforces Round 731 (Div.3) 所有题目题解

A. Shortest Path with Obstacle(难度:800)

题意

给定三个点 $a,b,c$ 的坐标,问从 $a$ 到 $b$ 不经过 $c$ 需要走的最小曼哈顿距离。

点坐标绝对值不超过 $10^3$,数据组数 $t$ 不超过 $10^4$。

题解

若 $a,b$ 横纵坐标均不相同,那么显然至少存在一条最短路径不经过 $c$。

否则,拐两次弯,答案为距离加 $2$。

B. Alphabetical Strings(难度:800)

题意:

串 $str$ 初始为 $0$,你可以按照字母表 $a sim z$ 的顺序在 $str$ 头或尾部加入字符,问是否存在某个情况使得 $str$ 等于 $s$。

$|s| le 26$,数据组数 $t le 10^4$。

题解:

倒着考虑,对串 $s$ 维护头尾指针 $l,r$,每次在两边找到一个正确的字符并将其删去,如果最后可以变成空串答案是 YES,否则是 NO。

C. Pair Programming(难度:1100)

题意:

当前有两列任务,每列任务分别有 $n,m$ 个任务,且需从左往右完成(但可以两列任务交替完成),一开始电脑上有 $k$ 行代码。

每个任务是一个数,若这个数 $a$ 是 $0$,那么电脑增加一行代码;否则代表该任务需要查找第 $a$ 行代码。

请构造一个完成任务的方案使得电脑不会报错(即查询没建立的代码行),否则输出 $-1$。

$k,n,m le 100$,$a le 300$,数据组数 $t le 10^3$。

题解:

贪心。优先取 $a=0$ 任务,然后再取其它任务。如果按照此办法电脑仍然报错,答案必为 $-1$。

D. Co-growing Sequence(难度:1300)

题意:

给定一个长度为 $n$ 的序列 $x_1,x_2,...,x_n$。

你需要构造一个字典序最小的序列 $y_1,y_2,...,y_n$,使得对于 $1 le i< n$ 每个 $i$ 有 $(x_i⊕y_i) & (x_{i+1}⊕y_{i+1})=(x_i⊕y_i)$。

$t le 10^4,  sum n le 200000, x_i < 2^{30}$。

题解:

首先 $y_1,y_2,...,y_n$ 需要字典序最小,因此 $y_1$ 要最小,为 $0$,然后是 $y_2,y_3,...$。

那我们可以维护一个 $num_i$,表示 $x_{i-1}⊕y_{i-1}$。每次查找 $num_i$ 上还有哪些位数 $k$ 它为 $0$,而 $x_i$ 为 $1$ 的,将 $y_i$ 第 $k$ 位设为 $1$。

这样按顺序递推即可,时间复杂度 $mathcal{O}(n log x_i)$。

E. Air Conditioners(难度:1500)

题意:

给定两个长度为 $k$ 的序列 $a_1,a_2,...,a_n$ 和 $t_1,t_2,...,t_n$。

对每个 $1 sim n$ 的位置 $i$ 求 $minlimits_{1 le j le k} (t_j+|a_j-i|)$。

$t le 10^4, 1 le sum k le n le 300000$,$1 le a_i le n$,$0 le t_i le 10^9$。

题解:

记位置 $i$ 答案为 $ans_i$,可以发现若 $a_j le i$,那么 $i$ 每加一个 $1$,$ans_i$ 就会增加 $1$。

因此我们可以把 $a_j le i$ 和 $a_j>i$ 的两种情况分开求解(这里 $a_j>i$ 改成 $a_j ge i$ 不影响答案,因此下文说的是 $a_j ge i$)。

对于 $a_j le i$ 的情况,从左往右跑,若碰到一个位置 $p$ 使得 $a_p=i$,那么 $ans_i=min(ans_{i-1}+1,t_p)$,否则 $ans_i=ans_{i-1}+1$。

对于 $a_j ge i$ 的情况,从右往左跑,与上面同理。最后答案取二者 $ans$ 的较大值即可。

至于如何对于位置 $i$ 找到位置 $p$ 使得 $a_p=i$,可以直接开一个 记录相关值。

时间复杂度 $mathcal{O}(n)$

F. Array Stabilization (GCD version)(难度:1900)

详细题解请点击这里

G. How Many Paths?(难度:2100)

题意:

给定一张 $n$ 个点、$m$ 条边的有向图,可能存在自环

问从点 $1$ 出发,到整张图所有节点的连通情况。具体如下:

  • 若从点 $1$ 到点 $i$ 只有一条路径,那么 $ans_i=1$。
  • 若从点 $1$ 到点 $i$ 有多(但有限)条路径,那么 $ans_i=2$。
  • 若从点 $1$ 到点 $i$ 有无限条路径,那么 $ans_i=-1$。
  • 若从点 $1$ 无法到达点 $i$,那么 $ans_i=0$。

这里的路径并不是简单路径,请求出所有的 $ans_i$。

$1 le sum n,sum m le 4 imes 10^5$,不存在重边。

题解:

我考场上没过,之后自己想了一个 Tarjan 做法,但是代码 TLE 在第 60 个点,暂时不知道哪锅了。

不过有另一种做法,就是 BFS 统计从 $1$ 可到的点,然后拓扑排序一次就可以求出所有答案了。建议这个做法去看别人的题解。

原文地址:https://www.cnblogs.com/zengpeichen/p/15003949.html