JGELR #1 非官方营业日志

A1. 遐想碧空无边

题意:

给定一个长度不超过 的字符串(小写英文字母),和不超过 个操作。

每个操作 L R K 表示给区间 的字符串排序, 为升序, 为降序。

最后输出最终的字符串。

题解:

热身题。我们建 棵线段树,分别维护每种字母的区间和;修改时就直接 执行区间推平操作即可。

B1. 即使暴雨倾泻

题意:

是一个排列,定义 : 设 的最大公因数(即前缀最大公因数),则 中不同的数的个数。

的所有排列 的最大值,你需要求有多少 的排列 满足 ,答案对 取模。

题解:

不难发现,这个 序列一定是分成若干段,段内相同,每段相较于上一段少一个质因数。设 ,那么这个 。不妨设 满足

,显然这个 最大的数只有 一个。对每个数计算出其带有多少个 因数,从高到低插进这个序列,不难计算方案数。

,那么这个 最大的数多了一个 ;我们直接枚举 的因数是在什么时候失去的即可用类似的方法来计算出它的方案数。

C1. 锈迹斑斑的梦

题面:

有一颗 个节点的树(节点从 依次编号)。每个节点有两个权值,第 个节点的权值为

你可以从一个节点跳到它的子树内任意一个节点上。从节点 跳到节点 一次的花费为 。跳跃多次走过一条路径的总费用为每次跳跃的费用之和。请分别计算出每个节点到达树的每个叶子节点的费用中的最小值。

注意:就算树的深度为 ,根节点也不算做叶子节点。另外,不能从一个节点跳到它自己.

题解:

从一个 的点向 的子树跳,到叶子的最小代价是一个关于 的一次函数构成的下凸壳。我们要做的就是动态维护半平面交合并和单点插入。我们直接李超树合并,复杂度是 的;因为每条直线只会从根一路传递到叶子,均摊一下复杂度就是 的了。

D1. 已不愿再沉眠

题意:

规定一组正整数 。当且仅当满足以下条件时该组正整数成立:

对于给定的数值 ,你需要找到成立数组的最大长度。

题解:

首先,一定存在一种最优解使得它是一个长度为 的周期不断循环形成的(感性理解一下,好像确实吧)。

其次我们发现,只要一个长度为 合法,那么把 无限循环下去它必然还是合法的。(反证,设第一块和第二块中存在两个元素相差为 ,那么就意味着第一个周期内存在一对数相差为 (由周期性),于是与 合法矛盾)。

因此,我们只需要找到一个长度为 的最优的 ,且使得 的数最多。

时:一个元素 可能和什么元素发生矛盾呢?一定是取模意义下的 (其中一个相当于相差 嘛)。而由 的关系构成的,一定是一个环(因为互质);因此实际上就是求一个环上最大独立集。 即可解决。将这个问题的答案记作

时:设 ,我们分成两类讨论,仔细思考一下发现:

A2. 水果

题面:

给定一个长度为 的 01 串 ,求出:

其中 表示 中最长连续全 1 子串的长度。

题解:

警告!警告!数据结构学傻啦!数据结构学傻啦!这个题 !设 。当 时,;否则, 表示上一处这么多的连续一是在哪个位置。(当然,聪明的你也可能直接用了吉老师线段树维护了这个东西 /fn)。

B2. 金币

题面:

一个 的棋盘上最初摆放有 枚金币。其中每一枚金币占据了一个独立的格子,任意一个格子内最多只有一枚金币。Alice 和 Bob 将要进行如下的一场游戏。二人轮流操作,且 Alice 先行。当轮到一个玩家的时候,他可以选择一枚金币,并将其向左移动任意多格,且至少移动一格。金币不能被移出棋盘,也不能越过其它金币。如果轮到一个玩家的时候他已经无法做出任何有效操作了(显然这个时候 枚金币恰好落在最左侧的 个格子中),则被判定为输家。已经知道 Alice 和 Bob 都是极致聪明的人,他们在任何局面下总能做出最优的操作。那么有多少初始状态能保证 Alice 必胜呢?

题解:

首先这个等价于一个阶梯 Nim 问题:

阶梯 Nim 问题:有一个楼梯,每个台阶上放了一些金币,每个人每次操作可以选择一级台阶将上面的一些金币放到下一级;不能操作的输。

结论:所有奇数级台阶上的金币数量异或起来就等于这个游戏的 SG 值。

简要证明:偶数级台阶可以是没有用的,因为一个人进行完一次偶数级操作后,另一个人可以再把那些金币放到更下面的一级,抵消这个操作;而操作奇数格相当于删除这些金币。这个思想很有意思。

现在我们就是要 个数异或和为 的数且他们的和小于等于 的方案数(最后还要插板法一下)。我们直接对于每一位分别考虑,每一位都是加上 的形式,直接类似背包地维护即可;注意系数上还要再乘上一个

C2. 砖块

题意:

给你 表示序列长度, 表示操作次数。

我们需要达成这么一个目标状态: 如果存在 这个元素,那么必须满足所有 元素都必须在序列中连续。

然后你可以进行这么一种操作,将所有的 元素的变为任意你指定的 元素,并且花费 的花费, 代表 元素的个数。

现在有 次询问,每次询问单点修改一个位置的值,求修改完之后最小花费使得序列满足目标状态。

注意:更新不是独立的,之前的更新会保留。

题解:

我们考虑一种元素的影响:设其最左边的元素在 ,最右边的元素在 ,则这个颜色相当于限制区间 中的元素都得是相同的。这样的区间相等的限制是具有传递性的;在充分考虑其传递性后,会把原序列划分成若干段,其中每段中都得转化成一种相同的元素,每段的贡献相当于其长度减去区间众数。

时,我们直接维护一个平衡树,平衡树中每个节点均代表一个区间,且须维护这个区间的区间众数及子树中众数之和。按任意顺序加入每种颜色的限制,每次会合并一些区间,形成一个大区间,在这个过程中可以计算出大区间的众数(而不需要借助其他区间众数的数据结构)。显然,新区间的总数是 的,所以总复杂度均摊下是 的。

时,直接线段树分治。但是这么做复杂度显然是错误的,不能把均摊的东西外面再套上一个其他什么东西是吧。而导致其复杂度错误的根源在于每次都会删除再恢复很多区间——这启示我们直接用fhq-treap 之类的东西来维护,每次合并区间直接 split 出来;回溯时,直接把这个子树 merge 回去。总的复杂度就是 了。这个做法非常暴力,因此也能使用于较多情况,即处理有需要均摊结合线段树分治类的问题。

D2. 树哥

题面:

给定一棵 个点的树,每个节点初始时是黑色或白色。

两个人博弈,轮流进行操作,每次操作选择一个白点 ,然后将 路径上的所有点染成黑色,谁先无法操作谁输。

要求判断先手是否必胜,若是,则还需给出所有先手的第一步方案。

题解:

这个题算是我做题经历最曲折的之一了。设 为只考虑 子树时的 值,于是我写下了第一个假结论:

这个错误的原因是没有考虑到 函数的 在再加入一个新的后继状态后不止可能增加一。于是我们考虑用更加大力的方式维护 值——我们直接维护所有后继状态。设 子树所有后继状态构成的集合,那么我们可以得到如下的转移方程:

直接用带翻转标记的 01 Trie 合并维护即可;注意一定要带标记,不能在合并时再计算翻转,因为子树下面可能挂着一堆尚未被翻转的点。

考虑如何输出方案?设 solve(u,k) 为在 子树内找到后继状态 的方案,直接递归下去执行即可。

A3. 数组

题意:

现在有长度为 的数组 和长度为 的数组 ,进行无穷次如下过程直至 数组值收敛

  1. 选择一个数字
  2. 同时使 (没有取整)

定义 为操作完成后 的值

现在你知道数组 和 长度为 的数组 ,保证

组询问,每次问使 的数组 有多少个(答案对 取模)。

题解:

超出了我的语言表达能力,因此咕咕咕。