Go to see the end

Problem CodeForces luogu 题解页数
A A - CodeForces A - luogu 2
B B - CodeForces B - luogu 3
C C - CodeForces Gym 2
D D - luogu 5
E E - luogu 3
F F - CodeForces F - luogu 2
G G - CodeForces G - luogu 6

A

A - CodeForces

A - luogu

杂题选讲课件里的第18~19页。

你会发现有个事情...

你其实不需要维护 $3 \times 10^5 \times 10^9$ 个数据,因为每次1,2操作后只可能有该段的第一个数成为全局最小值。因此你只需要维护 $3 \times 10^5$ 个数据。

如果把所有数据都看作平面直角坐标系中的点,如果下标是 $i$ 值是 $a_i$ 对应点就是 $(i-1,a_i)$,题目就变成了:

  1. 把所有点右移 $k$ 个单位并添加点 $(0,0)$。
  2. 添加点 $(T,0)$,其中 $T$ 表示未加之前的数组长度。
  3. 将所有点加上直线 $y=sx+b$,其中 $s$ 和 $b$ 都是正整数。
  4. 查询当前最低点坐标。

动态维护下凸壳即可。

注意:

  1. 维护1操作的总偏移量,便于以后计算。
  2. 斜率是 $s$,截距是 $b$,不要反!!!不然你就是

It is solved.

B

B - CodeForces

B - luogu

杂题选讲课件里的第11~12页。

引用Rain-chr的一句话:

相当困难的网络流题。

相信学过网络流的同学都猜到这是个二分图。这题建图有点奇怪,点数最大能达到 $8 \times 10^5$。

怎么建图?我们发现不可能有L形,也就是...

将原图每相邻两个 # 之间的边看作建图后的点,若建图后两个点对应原图中一个正方形内的相邻两边,则这两条边不能同时选中

在原图中,一条边被选中即意味着把这条边两边的正方形放到同一长方形中。因此,正方形相邻两边不同时选中等价于不存在L形,也就是符合题目条件。

要让长方形个数最少,就要让选中的边数尽量多,因此最佳方案显然是二分图最大独立集

最终答案为原图中 # 的个数减去二分图最大独立集

注意点数最大能达到 $8 \times 10^5$,因此用Dinic+当前弧优化!!!

因为写了ISAP+当前弧优化+GAP优化TLE了

It is solved.

C

C - CodeForces Gym

杂题选讲课件里的第25~26(26~27)页。

比如说这些点:$A(0,0),B(1,1),C(3,2),D(2,3),E(-2,4),F(5,6)$。如图所示,在红色 $\color{#FF0000}\triangle ABC$,绿色 $\color{#00FF00}\triangle BEF$,蓝色 $\color{#0000FF}\triangle CDE$ 三个三角形中分别找出斜率绝对值最小的边,可以发现分别是 $BC,EF,DE$。我们发现斜率绝对值最小的边两个端点的纵坐标总是相邻的,比如说 $\color{#00FF00}\triangle BEF$ 中 $B,E,F$ 的纵坐标分别为 $1,4,6$,那么称这个三角形中,$B,E$ 的纵坐标相邻,$E,F$ 的纵坐标相邻。根据以下式子:

$$ \frac{a}{b}<\frac{c}{d} \Rightarrow \frac{a}{b}<\frac{a+c}{b+d}<\frac{b}{d} $$

因此若两个点 $A,C$ 纵坐标不相邻,中间有点 $B$,那么 $AC$ 的斜率一定介于 $AB$ 和 $BC$ 的斜率之间,从而不可能成为最小值。

因此,斜率绝对值最小的点对纵坐标一定相邻,用莫队维护相邻点对的斜率集合即可。

对 $x$ 坐标莫队,按照 $y$ 坐标对点排序并维护相邻点对的斜率集合。单次修改是 $O(\log n)$ 的,将块大小设为 $O(\frac{n}{\sqrt{q}})$ 即可做到 $O(n \log n \sqrt{q})$。

——https://xinyoudui.com/courses/1700/all/#/pages/58464 第26~27页

\sqrtqwq/

It is solved.

D

D - luogu

推公式题。

首先我们...想到一个事情。题目中 $a_i \operatorname{bitand} a_j \ge \min(a_i,a_j)$ 是什么神奇条件?

根据 $\operatorname{bitand}$ 的性质,显然 $a_i \operatorname{bitand} a_j \le a_i,a_i \operatorname{bitand} a_j \le a_j$,因此 $a_i \operatorname{bitand} a_j \le \min(a_i,a_j)$。居然不等号方向反了

因此有 $a_i \operatorname{bitand} a_j = \min(a_i,a_j)$。还是看不出什么来...

不过如果有 $x \operatorname{bitand} y=x$,那么把 $x$ 二进制中为 $1$ 的位置下标看作集合 $X$,$y$ 二进制中为 $1$ 的位置下标看作集合 $Y$,那么 $X \subseteq Y$。其中 $2^0$ 到 $2^n$ 位的下标分别是 $0$ 到 $n$。

例如 $0,1,2,6,7$,那么 $(x,y)=(0,1),(0,2),(0,6),(0,7),(1,7),(2,6),(2,7),(6,7)$ 均满足条件(假定 $x < y$)。

考虑DP每个数分别要装在第几个箱子里,因为这是一个DAG(有向无环图),所以对它拓扑排序后按每条边转移即可。其实拓扑序就是原数从小到大的顺序。

但是边数太多了qwq!

为了让边数更少,我们发现上文中 $(x,y)=(2,6),(2,7),(6,7)$ 明显存在冗余,$(2,7)$ 是一条无用边,所以拓扑排序后只考虑有用边即可。

但是判定有用边就会超时!

怎么办?我们想到如果有一个输入是这样子:

1048576
0 1 2 3 4 5 6 ... 1048575

那谁看了都笑。这有用边就是 $x$ 与 $y$ 只差 $1$ 位的 $(x,y)$!

如果把输入转化成这个样子,那么就可以轻松解决。可不可以...

仍然是DP每个数分别要装在第几个箱子里,下标是 $0$ 到 $2^{20}-1$。这次,转移方程如下:

$$ dp_i=\max_{j}(dp_j)+v_i $$

其中 $j$ 为 $i$ 在任意为 $1$ 的二进制位变为 $0$ 后的值,$v_i$ 表示 $i$ 是否在输入中。

举个栗子。假设输入为:

5
0 1 6 7 2

此时 $dp_3=v_3+\max(dp_1,dp_2)=0+\max(1,1)=1$。

$dp_7=v_7+\max(dp_3,dp_5,dp_6)=1+\max(dp_3,dp_5,dp_6)$。

稍加计算可得 $dp_7=1+\max(1,1,3)=4$。

It is solved.

E

E - luogu

这跟Asadashino有何关系?

先看奇怪的女装(简称nz)。

当我们进行nz操作后,原序列将会变为:

$a_l$ $a_{l+1}$ $\cdots$ $a_{p-1}$ $a_p$ $a_{p+1}$ $a_{p+2}$ $\cdots$ $a_{r-1}$ $a_r$
$a_p$ $a_{p-1}$ $\cdots$ $a_{l+1}$ $a_l$ $a_r$ $a_{r-1}$ $\cdots$ $a_{p+2}$ $a_{p+1}$

仔细看将会发现这相当于把原序列整体旋转加整体翻转。由于整体翻转不影响查询结果,因此可以简单看做整体旋转

旋转+旋转=旋转,因此任意多次nz都可以合并为 $1$ 次。

再看诗乃序列。

我们希望维护任意区间的最长相同子段

根据线段树的基本思路,我们可以维护任意区间的最长相同前缀子段、相同后缀子段和相同子段。同时要维护区间的最左端值和最右端值

此题线段树比较难写...核心代码

询问时,如果 $k=0$,直接输出最长相同子段;$k>0$ 时,如果最左端值与最右端值相等,最终结果还要与最长相同前缀子段+最长相同后缀子段取max。

需要保证最终结果不超过询问区间长度

我调线段树调了 $3$ 个小时qwq

It is solved.

F

F - CodeForces

F - luogu

我估计没有谁会第一眼想到长链剖分。

考虑第一条边如何加。

  • 对每条割边,它的在树上深度较大的节点的子树内所有树边也都是割边。
  • 割边数最少。

因此:

  • 第一条边必须一端是 $1$。
  • 根据贪心,第一条边必须连向深度最大的点。

若将树拆成链并像树链剖分一样计算 $top_i$,那么一条链的贡献就是 $dep_l-dep_{top_l}+1$。其中 $l$ 是叶子节点。

长链剖分,将所有叶子节点的 $dep_l-dep_{top_l}+1$ 丢到优先队列中,第一次取最大的一个,然后每次取最大的两个计算减少的割边数即可。、

It is solved.

G

G - CodeForces

G - luogu

有没有感觉...像4.6模考题虚无缥缈(异或线性基)和2.8模考题铁路突击(欧拉回路)!

的确很像,但本次作业题和异或一点点关系都没有,而是类似gcd基的问题。

给定有向带权图,若干次询问,每次给出 $v,s,t$,问是否存在经过 $v$ 的回路权值 $\equiv t − s \pmod t$。

经过 $v$ 的回路

因为这个有向带权图是静态的,所以可以求出其强连通分量,之后任意给定 $v$,经过 $v$ 的回路一定在 $v$ 所在的强连通分量中!

(以下的讨论都在 $v$ 所在的强连通分量中进行。)

可以发现,只要有一个经过 $v$ 的回路权值 $\equiv a \pmod t$,那么你可以走这个回路 $t$ 次,得到一条权值 $\equiv 0 \pmod t$ 的回路。你也可以走这个回路 $t-1$ 次,得到一条权值 $\equiv -a \pmod t$ 的回路。

又可以发现,同一强连通分量中若存在一条从 $x$ 到 $y$ 权值 $\equiv a \pmod t$ 的路径,则必然存在一条从 $y$ 到 $x$ 权值 $\equiv -a \pmod t$ 的路径。很简单,一定存在一条同时经过 $x$ 和 $y$ 的回路。从 $y$ 开始沿回路走 $t$ 圈,走完之后往回“退”到 $x$ 的位置(也可以理解为在最后一圈时只走到 $x$ 就结束)。容易证明这条路径权值 $\equiv -a \pmod t$。

那么,对于点 $v$,若强连通分量中存在一个权值 $\equiv a \pmod t$ 的回路,则可以从 $v$ 出发:

  1. 以任意路径走到回路上任意点 $u$,记该路径权值 $\equiv b \pmod t$。
  2. 沿着回路走 $k$ 圈回到 $u$,获得权值 $\equiv ka \pmod t$。
  3. 存在一条从 $u$ 到 $v$ 权值 $\equiv -b \pmod t$ 的路径,沿该路径走回 $v$。
  4. 最终获得权值 $\equiv ka \pmod t$。

因此,根据裴蜀定理,记 $g$ 为该强连通分量中所有环权值的gcd,那么在模意义下,回路权值可以且仅可以取到 $g$ 的倍数。

如何求 $g$?

  1. 初始时 $g \leftarrow 0$。
  2. 求出原强连通分量中的任意一个dfs树,并计算每个点的高度(从dfs树根节点到该点的树上路径权值),点 $v$ 的高度记为 $h_v$。
  3. 对于任意边 $(u,v)$,计算 $h_u-h_v+l_{(u,v)}$ 并与 $g$ 取最大公约数。其中 $l_{(u,v)}$ 表示边 $(u,v)$ 的权值。

这样,当 $(u,v)$ 是dfs树的边时,其结果为 $0$,不影响 $g$;否则:

  1. 从 $v$ 走到根节点,权值 $-h_v$。
  2. 从根节点走到 $u$,权值 $h_u$。
  3. 从 $u$ 通过 $(u,v)$ 走到 $v$,权值 $l_{(u,v)}$。
  4. 总权值 $h_u-h_v+l_{(u,v)}$。

我们实际上计算了一个通过 $(u,v)$ 的回路的权值。由于任意回路都至少要经过一条非dfs树的边,就可以将这条回路拆解为多条,每条只通过一个非dfs树的边,权值同样是 $g$ 的倍数。

最后,看 $s$ 是不是 $\gcd(g,t)$ 的倍数即可。

It is solved.

The End

Go Back

B因为写了ISAP+当前弧优化+GAP优化TLE了

E核心代码

G裴蜀定理P4549裴蜀定理OIwiki

Problem CodeForces luogu 洛谷题解
A A - CodeForces A - luogu A
B B - CodeForces B - luogu B
C C - CodeForces Gym Not Found
D D - luogu D
E E - luogu E
F F - CodeForces F - luogu F
G G - CodeForces G - luogu G