这场细节好多啊。。

A

先考虑一个暴力的做法:设 $x>y$,那么 $x,y$ 移动后在同一个位置上当且仅当满足 $x-y = a_{y \bmod n}-a_{x \bmod n}$,符号相反不好看,于是我们令 $\forall i,a_i = -a'_i$,那么相当于要满足 $x-y = a_{x \bmod n}-a_{y \bmod n}$。

现在我们考虑去枚举 $x \bmod n$ 和 $y \bmod n$,那么相当于是要满足 $\exists k_1,k_2 \in \mathbb Z,x+k_1n-(y+k_2n) = a_x-a_y$。拆开写可以变成 $\exists k \in \mathbb Z,x-y+kn = a_x-a_y$,也就是 $x-y = a_x-a_y \pmod n$,移项后就是 $x-a_x = y-a_y \pmod n$。直接搞个桶记录一下就好了。

B

首先可以观察到如果这张图存在一种方案,那么答案一定是黑色连通块个数(因为你在每一个连通块边界都放满 S 就好了)。

那么问题现在转化为如何判断这张图是否有解。反正我是讨论不全。。

  1. 如果存在某一行(列),这一行(列)上黑色格子不连续,就无解
  2. 如果 S 想要放在白色格子上,必须要满足这行这列都没有黑色格子。(也就是不能存在某一行(列),这一行(列)都是白色点,并且所有列(行)都有黑色点)。

C

考虑对于任意有关系的一对点 $(i,j)(i < j)$,可能的情况只有 $\forall i,\exists j$ ,$\exists i,\exists j$。也就是说我们肯定要从前往后如果这个点能 $\forall$ 就让它选择 $\forall$。

发现一个点能选择 $\forall$ 的充要条件是比它编号小的点都和它无关。所以我们根据不等关系连出 DAG 和反向 DAG,首先 DAG 有环就肯定无解。否则可以对于每个点预处理出和它有关的编号最小的点,然后判断是否 $<i$ 即可。

D

这个题一开始没思绪的原因是没注意到每次是 $+1$,直接求导发现不是凸函数就自闭了。。

我们可以算出每次操作的增量:记 $g(x) = f(x+1)-f(x) = -3x^2-3x-1+a_i$,我们有 $g(x)' = -6x-3$,注意到 $g(x) < 0 ,x \in \mathbb N$,所以 $f(x)$ 在 $x \in \mathbb N$ 上单调减。

所以一个 $O(k \log n)$ 的做法就是每次取最大的 $g_i(x)$,用堆维护。

我们根据贪心的做法就可以发现我们每次选出的 $g_i(x)$ 一定是不增的,所以我们可以二分最后一次选出的值是啥,就可以解出对应的 $b_i$。但是注意到这样 $\sum b_i$ 和 $k$ 还是差了一些的,不过可以证明差不超过 $n$,暴力贪心就好了。

这题二分的地方有点细节,容易写挂。也有可能是只有我容易写挂

E

一开始读错题了:这个题目的意思是每个时刻只能换一个点的开关。

可以发现火车之间是独立的,所以我们分别考虑每一个火车:

假如说火车 $t$ 时刻在 $v$ 点,并且当前这个点指向的不是这个火车的目标地点,设上一次和它不同向的火车到达这个点的时间为 $pre$,那么相当于要求在时间 $(pre,t]$ 必须要在 $v$ 点进行一次切换操作。如果能求出来所有这样的区间,假设这样的区间有 $k$ 个,我们可以用一个 $O(k \log k)$ 的贪心完成。(每次贪心选择当前能选的右端点最小的区间即可)。现在我们想找到 $k$ 有多大。

$k$ 看起来是 $O(n^2)$ 级别的,但是其实不然:我们可以把每个车看成一次 access 操作,把 LCT 上的重边看成当前的开关指向的车站,发现只有在轻重边切换的时候才会增加一个这样的区间(和上一次火车的方向不一样),所以区间个数是 $O(m \log n)$ 的。

于是我们直接用 LCT 模拟上述步骤,然后贪心即可。注意这里 LCT 在 access 的时候略有不同:传统的 access 是会把 $v$ 向儿子连的重边清空的,这里就不用。

F

开头不太好想到。

我们给每个颜色一个编号,比如 $R=1,Y=2,B=3,W=0$,我们发现 mix 操作实际就是异或操作,但是我们并不会描述修改操作。

这种情况我们应该想到拆位:把一个数字拆成 $a_i2+b_i$,发现操作分别对应:

  • RY:交换 $a_i$ 和 $b_i$
  • RB:$a_i \gets a_i \oplus b_i$
  • RB:$b_i \gets a_i\oplus b_i$

然后就可以维护处每一个位与答案的关系,相当于解一个异或方程组。我们可以直接把自由元设为 $0$,符合题意。

这里复习一下如何解方程:

考虑有 $n$ 个变量,$m$ 个方程的方程组$Ax = B$,消完元之后:

  • 如果存在形如 $0=a$ 的方程,那么方程无解。
  • 如果存在形如 $0=0$ 的方程,那么有无穷多组解。
  • 否则有唯一解。

注意在齐次方程组中没有第一种情况。

Last modification:August 31st, 2020 at 11:02 am
如果觉得我的文章对你有用,请随意赞赏