..

UOJ Round #8

A. 赴京赶考

30

$n, m \le 100$
$q \le 10$

使用 0-1 BFS 搜索。

时间复杂度 $\mathcal O(qnm)$。

50

$n \le 10^5, m = 1$
$q \le 10^5$

预处理 $(1, 1) \rightarrow (1, i)$ 和 $(1, i) \rightarrow (1, n)$ 的结果,将 $(1, i) \rightarrow (1, j)$ 和 $(1, j) \rightarrow (1, n) \rightarrow (1, 1) \rightarrow (1, i)$ 的结果取较小者。

时间复杂度 $\mathcal O(n + q)$。

100

$n, m \le 10^5$
$q \le 10^5$

对于 $a_i \neq a_{i + 1}$,无论 $b_j$ 取值,从 $(i, j)$ 穿越到 $(i + 1, j)$ 必然会花费等待时间。

对于 $a_i = a_{i + 1}$ ,必然不会花费等待时间。

所以一条路线的总等待时间可以拆分为各个维度的等待时间之和。

时间复杂度 $\mathcal O(n + m + q)$。

B. 决战圆锥曲线

10

$n \le 100$
$m \le 100$

暴力模拟。

时间复杂度 $\mathcal O(nm)$。

30

$a = c = 0$

查询区间 $y$ 最大值,使用线段树维护。

时间复杂度 $\mathcal O(m \log n)$。

50

$c = 0$

只考虑 $x, y$,显然影响答案的点在凸包上,使用线段树维护上凸壳。

注意存在翻转操作,还要维护区间的下凸壳。

由于数据随机,一个长度为 $n$ 的区间凸包大小是 $\mathcal O(\log n)$ 的,所以在线段树 PushUp 时可以暴力合并凸包,修改操作单次 $\mathcal O(\log^2 n)$。

询问操作可以暴力扫每个子区间的凸包上所有点,带入得到最优值,也是单次 $\mathcal O(\log^2 n)$。

时间复杂度 $O(m \log^2 n)$。

70

$n \le 10^5$
$m \le 2 \times 10^5$

对于一个点 $(x_i, y_i)$,如果存在一个点 $(x_j, y_j)$ 满足 $x_i \le x_j$ 且 $y_i \le y_j$,那么 $i$ 对答案是一定没有影响的。

由于数据随机,一个长度为 $n$ 的区间对答案产生影响的点个数为 $\mathcal O(\log n)$。

使用用线段树来维护区间内对答案产生影响的点集。

时间复杂度 $\mathcal O(m \log^2 n)$。

C. 宿命多项式

10

$n \le 1$

\[\begin{aligned} & 1 \le a_0 \le c_0 \\ & 1 \le a_0 + a_1 \le c_1 \end{aligned}\]

对于一个 $a_0$,$a_1$ 有 $c_1$ 种选择,答案为 $c_0 \cdot c_1$。

20

$n \le 2$
$c_i \le 10^5$

\[\begin{aligned} 1 & \le a_0 \le c_0 \\ 1 & \le a_0 + a_1 + a_2 \le c_1 \\ 1 & \le a_0 + 2a_1 + 4a_2 \le c_2 \end{aligned}\]

枚举 $c_0$,符合条件的 $a_1, a_2$ 在平面上对应的点为一个平行四边形,问题转化为统计该平行四边形内部整点数。

Pick 定理:给定顶点座标均为整点(或正方形格子点)的简单多边形,其面积 $A$ 和内部格点数目 $i$、边上格点数目 $b$ 的关系:

\[A = i + \frac{b}{2} - 1\]

60

$n \le 4$

考虑更换枚举对象,不要枚举系数,而是枚举这个多项式的点值。

每次解方程组时未知数前系数都是不变的,变的只是右边的常数。

把系数矩阵的逆矩阵求出来,会发现逆矩阵中的元素的分母都很小。

由于我们只在乎解是否是整数而不在乎解具体是多少,只要枚举 $f(1), \cdots, f(n)$ 在模其对应分母意义下的值,判断对应的系数是否是整数即可。

时间复杂度 $\mathcal O((n! (n - 1)! (n - 2)! \cdots 1!)^2 \cdot n)$。