0%

20241218 部分作业

too hard for me!(2)

Atcoder 链接

感觉其实是把官方题解翻译成中文之后加了点东西。

QOJ9875. Don't Detect Cycle

题意

给定一张 个点 条边的简单图。

现在你需要按照顺序加入这 条边,使得加入一条边时,两个端点都不在任何一个环里面。

判断有没有解,有解的话还需要构造方案。

题解

正着不好做,考虑倒着做。

初始有一张图,需要找到一个删边的顺序,使得删完边之后的两个点不在一个环里面。

删完一条边的时候显然限制是会变弱的,所以这个时候一定是能删的尽早删。

那么求出这张图的边双,割边放到最后删肯定不劣,那么只需要考虑一个边双内部怎么办。

可以发现,一条边 可以删掉相当于这两个点在边双内部度数均为

考虑 这条边删掉之后,整个边双会分裂成若干个边双,形成一条链。

如果 度数 ,就说明分裂完之后 所在的新边双里面不只一个点,不只一个点就一定仍然存在一个点。

所以 在之前边双内部度数一定恰好是 ,点 同理。

所以直接一条一条删就做完了。复杂度

提交记录

QOJ9876. Self Checkout

题意

给定一个由 组成的长为 的序列

现在需要计算只包含 的序列 的数量,满足 经过如下过程能够得到

  1. 初始有一个空序列
  2. 当前不为空,令变量 ,否则过程结束,返回序列
  3. 若当前 中至少有一个 ,令 ,然后将序列中第一个 删掉。
  4. 若当前 不为空,将 加上序列第一个数字,然后将第一个数字删掉。
  5. 放到 的末尾,然后返回第二步

题解

首先考虑操作 进行了 次的情况。

枚举操作 进行了 次。

那么 的前 个数字只有 ,后 个数字只有

先来考虑前面的部分,先来考虑 前面全是 的情况,可以发现,这种情况只需要 开头有

然后考虑 前面全是 的情况,此时需要 开头有 ,需要满足任意前缀中 。直接反射容斥。

然后考虑 中既有 又有 的情况,不妨发现,把这些连续段拿出来,段与段之间是独立的。

只有可能最后一段是全 ,然后和后 个数字有一些联动,还是直接反射容斥一下就行。

然后是操作 进行了 次的情况,此时操作 一定进行了 次。

也就是说, 中一定前面 个数字是 ,最后一个数字是

那么就只需要管前面即可。

提交记录

QOJ9877. Segment Tree

题意

现在有一张 个点和 条边的图。

边有边权,所有边形成一个线段树的样子。

现在需要进行 次操作,每一次操作要么修改一条边的边权,要么查询两个点之间最短路。

题解

其实这道题相当于是,有一棵维护了区间和的线段树,每一次可以花费若干代价,询问线段树的一个区间和。

一个询问相当于给你一个区间,查询区间和,最少需要多少代价。

查询有几种方式:

  1. 如果查询的区间恰好对应了线段树上一个完整的点,那么可以直接查询这个区间;
  2. 将这个区间分成两部分,分别进行查询;
  3. 查询这个区间的某个超集,然后再查询超集减掉额外部分。

考虑如何计算代价。

首先,如果一条边的边权比他两个儿子的和还要大,那么我们先给他取一个

这样的话,方式 显然就只有一种可以直接选择。

对于询问,考虑从其中一个点在线段树上一直往上跳,并维护其到每一个祖先的最短路。

另一个点同样处理,两个距离加起来取 min。

提交记录

QOJ9879. ReTravel

题意

初始有一个机器人在原点。给定 个平面上的点,现在需要进行若干次操作,使机器人按顺序访问点

操作共有以下 种,初始有一个空的字符串

  1. 让机器人向 轴正方向走一步,将一个字符 添加到 末尾,花费 的代价;
  2. 让机器人向 轴正方向走一步,将一个字符 添加到 末尾,花费 的代价;
  3. 撤销 最后一个字符对应的操作,不花费代价。

题解

同理。

表示以 为起点,按顺序便利 这些点,最少的代价是多少。

首先边界状态是

考虑当 的时候如何转移。

假设此时第一个进行的操作为一操作,那么此时会先解决掉 这些点,然后撤回这个一操作,继续走后面。

此时一定不会有 ,因为如果中间一个点都没走到,那么显然进行的一操作就浪费了,直接不走就好了。

此时也一定不会有 ,因为一定存在一个 ,进行一操作不撤回的话显然走不到点

那么我们枚举 ,就将整个问题拆成了两个子问题

时间复杂度

提交记录

QOJ9880. Origami Warp

题意

现在有 条直线,第 条直线以 的形式给出,表示这条直线经过 这两个点。

保证第一条直线为 轴,第二条直线为 轴。

现在有一个点 ,可以进行若干次操作,每一次操作是选择一条直线 ,然后把 按照直线 对称过去。

称点 能到达点 ,当且仅当对于任意的 ,都能在有限步之内,使得 的欧几里得距离

给定 组询问,每一组询问给定 两个点,询问 是否能到达

数据组数

题解

首先这个可达性有一些性质。

不妨设现在有两条直线,这两条直线的交点为原点 ,第一条直线是 轴,第二条直线的倾角为

假设当前有一个点 ,他的倾角为

那么我们首先可以知道,如果只使用这两条直线,则 的长度永远不会变。

考虑把点 先按照第一条直线对称,得到的倾角为

再把点 按照第二条直线对称,得到的倾角就是 。也就是说,只用这两个操作可以得到所有的

画出一个以 为圆心, 为半径的圆

此时,若 是一个无理数,则一定可以到达, 上的每一个点。

考虑题目的直线是以两个整数点的形式给出的,那么 一定也是一个有理数。

在这个条件下,可以发现,若 为有理数,那么 一定是 的倍数。


那么,若两条直线的夹角不为 的倍数,则称这两条直线的交点为好的交点。

这样一个好的交点,就可以让我们把一个点移动到一个圆上的任何一个点去。

那么初始的时候,若至少存在一个好的交点,则说明存在至少一条直线,倾斜角不是 的倍数。

考虑此时若存在不为原点的好的交点,则平面上任意两点都可以到达。

否则,平面上只有原点一个好的交点,此时一个点可以到达所有和原点距离相同的点。

那么问题在于,如果此时没有好的交点,如何判断答案。

此时只会有倾斜角为 的直线,设他们分别为 型直线。


先来考虑一个一维的问题,现在有一个数轴,数轴上有 个点

初始时有一个点 ,每一次可以进行的操作是把 转到某一个点 的对称点去。

现在问能不能把点 对称到另外一个给定的点 去。

的情况特判掉,然后设

那么 能到 当且仅当

证明的话和上面某部分差不多,考虑把 一次对 两个点对称,那么可以到 去。

后面就比较容易能证出来恰好是那两种情况能走过去。

有趣的事情是,如果我们将这 个点替换为 两个点,那么答案不变。这个结论后面要用。

那么回到原题,此时若没有 型直线,那么横纵两维就是两个独立的一维问题,可以分开做。


再来考虑有 型直线的情况。

假设现在有三条直线交于一个点 ,三条直线分别为 型,那么删除 型的直线,答案不会变化。

为什么呢,假设一个点 (相对于点 )的倾斜角为 ,那么操作一次 型可以变成

那么按照 的顺序操作, 也能达成目标。

所以删除这条 型的直线,不影响答案。其他方向是同理的。

那么也就是说三条直线里面,他们的效果有 ,也就是说我们可以把一条 型直线替换为一条 型直线。

初始的时候我们至少有一条 型直线( 轴),那么我们就可以将所有的 型直线都转为 型直线。

根据上面一维问题的相关证明,我们可以假设此时 型直线最多只有两条。

那么我们现在至少有一条 型直线,考虑将所有的 型直线都转为 型直线。特殊的,不删除 轴这条直线。

(将 型直线转为 型需要借助一个 型直线,注意如果此时有两条 型直线,那么两种转过去的方式都要进行)

为当前所有 型直线两两位置差的 ,那么我们任意加 型直线 都不影响答案。

特殊的,还可以发现我们任意加一条 型直线 也不影响答案。

为什么呢,因为你可以看成把所有 型直线换成 型,可以发现求出来的 值是相同的。

此时,如果我们有两个 型直线,把其中一条转化为 型。

那么现在,我们拥有所有 形式的 型直线,并且我们有至多一条 型和至多一条 型直线。


此时有一种神奇的判断方式,考虑先枚举 型和 型是否使用,此时有 种情况。

然后后面的过程中,只使用 型两种直线,可以证明这样判断是正确的。

首先,这样能操作到的点,肯定是正常情况下能操作的。

我们现在需要证明,所有可达的点,都能通过这种方式操作得到。

考虑,假如我们现在有一个由 构成的操作序列。

若现在有一个 操作,他的前面是一个 操作,设这两条直线的交点为 ,则我们一定有一条 型直线经过点

那么我们就可以将一个 操作替换为一个 操作, 操作都可以这样替换。

这样我们就把一个 操作往前提了一个位置,这样我们就能把所有 操作都堆在序列的最前面。

由于 型直线是完全垂直的,所以这两种操作是完全独立的,操作顺序不受影响,所以两个操作最多各进行一次。

时间复杂度

提交记录

QOJ9878. A xor B plus C

题意

给定四个数字

定义序列 为:

题解

下文中使用 代表二进制下按位异或运算。

表示 二进制下的第 位,即 。特殊的,有

表示计算 时第 位是否有进位,即

考虑 的计算过程,那么我们还能得到

观察一下,可以发现这还能说明


首先来观察一下 ,那么因为 ,所以直接就是

那么还有

所以 有长为 的周期,这也说明了 有长为 的周期。

同时我们也可以使用数学归纳法证明,所有 都有长为 的周期。

首先设 。则 也应有 的周期。那么:

这说明如果 有长度为 的周期,就可以证明 有长度为 的周期。

的情况已经证明过了,所以可以数学归纳法证明 都有 的周期。

此外,还可以得到应该有


那么考虑一下这道题应该怎么做。

如果想要知道 ,我们可以考虑去维护 ,但是这显然是不好搞的。

但是若我们知道了 ,那么我们就能知道 ,进而得出

所以有一个自然的想法,就是我们去维护

根据前面的讨论,我们知道 的周期是 ,那么考虑去维护 里面的 分别在哪里。

,那么对于 的部分,我们可以暴力去维护。因为此处 长度最多也就

那么后面的部分呢,我们仍然考虑暴力维护 的位置,所以下面我们证明, 的数量不会特别多。

如果 全都是 的话,最低一位和上面是完全独立的,可以分开去做。

那么不妨假设 不全为 ,下面证明对于 ,此处的 表示可重集。

首先我们知道 。还有: 那么我们可以发现当 的时候有 。这说明

如果 ,那么 就等价于

此时如果 ,那么 恰好有一个

这说明 的时候有

同理,此时如果 ,那么 时两个数字都是 ,当 时两个数字里面恰有一个

那么说明 时有

那么当 的时候, 就可以推出 ,那么 自然成立。

而根据我们的假设, 不全为 ,那么推一下就能知道一定有

而这恰好又能推出 。所以结论成立。


对于 的部分,此时有

那么根据我们之前的式子,此时就有

那么可以发现,这等价于 同时满足。

考虑令 ,那么 就是 的数量。我们希望证出这个数字不是很大。

先来考虑第一个条件,首先因为 ,那么

那么 就完全由上一位的进位即 决定。

那么可以得到

那么就有

不妨设

那么考虑, 的周期长度是 的周期长度是 ,考虑 怎么计算。

首先如果 ,那么一定会有

否则 ,则有

根据之前的证明,我们知道恰好存在一个 满足 ,我们令这个 为唯一的这个

特殊的,从之前的证明还可以看出,所有的 所对应的 都是相同的。

那么若 ,则有 。这说明

这是好的,因为这部分情况下 的个数并没有增加。

而当 的时候,有

那么问题在于, 的差距有多大。

考虑如果 ,那么此时会有

只有 的时候, 才可能为 ,而若 又一定会导致

所以此时应该有

那么去掉 这个限制,可以发现一定有

对于 的情况,我们首先知道有

那么对于 的情况,就有

所以说 的数量不超过 。(你妈的终于推完了)

为最小的 满足 ,则 内至多有

为剩余的 的个数,则这个数字是 级别的。

那么在 里面,我们只需要维护 的位置。

然后用 set 瞎模拟一下每一个数字消失的时间,能做到

直接暴力模拟最坏是 的,其中 表示多少轮之后所有 都消失了。

最坏可能是 级别的,但是显然卡不到,实际运行中应该是 这个级别的。

提交记录

QOJ9881. Diverge and Converge

题意

给定两棵 个点的数,边集分别是

现在需要构造两个长为 的排列

然后会进行 次操作,第 次操作为将第一棵树里的边 删掉,然后加上

第二棵树同理,要求每一次操作完之后,得到的仍然是两棵树。

题解

考虑归纳进行构造,那么 显然啥都不用输出。

设两棵树分别为 ,那么考虑将两张图并到一起。

并起来的图一共有 条边,那么度数总和就是

这说明图中至少存在一个点 ,满足 的度数

那么 的度数只有可能是 ,考虑分类讨论。

的度数是 ,则其一定在 中各连了一条边。

那么我们考虑第一步把这两条边交换,然后把 从图中删除得到两棵树

都是有 个点的树,存在一个合法的方案,那么我们就构造出了 的方案。

那么如果 的度数是 ,我们不妨设 的度数为 ,在 的度数为

中与 有连边,在 中与 两个点有连边。

那么我们令 删掉 得到的树, 删掉 并加入边 得到的树。

应该能构造出一组解。设 这条边在时刻 被交换。

不妨假设,在时刻 交换之前, 中去掉 这条边之后, 连通。

那么对于 之前的时刻,加入点 和边 后,仍然合法,因为 恰有一个来自 一个来自

那么考虑在 时刻之前我们额外加入一个交换 的操作,显然加入之后仍然合法。

那么下一步的操作是交换一条边 和边 。那么在 中,我们交换 这两条边。

手动模拟一下,可以发现这样是合法的。

提交记录