record 7.1-7.7

Dilworth 定理构造解

就是让你真的构造若干个链给它覆盖了。当然你可以跑一个 flow,但是我们有一些更快的方法。

我们认为这个问题是在一张特殊的 DAG 上考虑的。

具体来说,我们记 \(f_u\)\(u\) 结尾的最长反链的长度,这个可以通过一次 DP 求得。(真的?假的)

为了构造一个方案,首先我们知道最小链覆盖 = 最长反链,所以我们构造的第一步就是找一个链,使得去掉这个链之后,最长反链 -1。

为了实现这一点,我们取出所有 \(f_u=mx\) 的点,注意到它们之间必须两两连边,否则 \(f\) 会变得更大。因此我们把它们取出来就可以了。

我们知道,这张导出子图是一张竞赛图,而竞赛图存在哈密顿路径,所以确实能够找到这样的一条链。

这样继续进行下去,我们发现就是把 \(f_u\) 相等的给找出来,然后每个部分分别求一个哈密顿路径。因为是竞赛图,所以我们缩点之后只需要对每个 scc 单独做就行了,这个复杂度大约可以做到 1 log。

另一个就是构造若干个反链给它划分了,这个反而简单一点。

我们仍然记 \(f_u\)\(u\) 结尾的最长链长度,这个可以通过 DP 求得。(真的)

然后取出所有 \(f_u=mx\) 的点,它们之间必须没有连边,所以我们直接取出来就行了。

这个相当于证明了 最长链 = 最小反链覆盖,是个对偶定理,构造方法简单得多。我不知道能不能用这个做法解决上面的那个问题。之后再研究。

这个是合情合理的,因为我们似乎没有手段把一个关系变成它的对偶关系。

不对不对,最上面的那个做法是假的,因为不可比关系性质很差。

当然有一种方法是,你针对原先的关系 R 构造出另外一个关系,使得原来可比等价于现在不可比,然后如果存在一种合适的定向方案使得这个新关系是偏序,那就可以用第二个做法来构造了。

例如你要用 LIS 覆盖整个序列,那你就构造最长不上升子序列作为新的偏序关系,对这个东西构造反链就行了。

不对,最上面那个好像又对了。你只要能求出来 \(f_u\) 表示包含 \(u\) 的最长反链长度,那后面就都是一样的做法。问题是你很可能求不出来。

[mxr33 A]

简单题。

首先我们考虑二分,check 条件是 \(x\rightarrow y\) 可以通过只走一条 \(>mid\) 的边到达。

那这个东西你考虑怎么维护。我们整体二分,然后维护 \(mid\) 从左到右扫一遍。这样只需要扫 \(O(\log V)\) 次。

一次扫的过程中,我们维护由 \(\le mid\) 的边所构成的连通块以及它们的出边,这个过程可以使用启发式合并来完成。

这样复杂度是 3 log,有点逊,但是 \(n,q\le 10^5\),大概能过。

过不了一点。

有一个唐氏 2 log 做法,是改成可持久化平衡树。显然跑得还不一定有 3 log 快。

另一个做法,我们把二分去掉,顺序操作一遍,然后在每个询问第一次成立的时候回答它。这样就是 2 log 了。

? [mxr33 B]

不是很懂。

\(c_i=\min(a_i,b_i)\),那么接下来我们关心两个值,\(val_{\sum c},cnt_{\sum c}\)

其中,\(val_{\sum c}\) 表示一个正整数序列 \(c_k\),它的和是 \(\sum c\),权值是每项乘积,问你所有可能序列的权值之和。

这个东西,我们知道是 \([x^{\sum c}](\frac{x}{(1-x)^2})^k=[x^{\sum c-k}]\frac{1}{(1-x)^{2k}}=\binom{\sum c+k-1}{2k-1}\)

然后,\(cnt_{\sum c}\) 表示方案数。这个方案数,我们可以枚举上面有多少个有值的位置,然后做一做啥的。

\[\sum_{x=0}^k\binom{k}{x}\binom{n-\sum c-1}{x-1}\binom{m-\sum c+k-x-1}{k-x-1} \]

额,然后你会了一个平方做法。烂完了,起码来个线性吧。

另一个做法是考虑二元 OGF,经过一番推导之后发现是 \([x^{n-k}y^{m-k}](\frac 1{(1-x)(1-y)(1-xy)})^k\),显然的一个做法是我们枚举 \(xy\) 项选了多少个,然后剩下的就独立了。

感觉要做 \(1e18\) 是不是怎么着都得上点科技啥的。

其实不需要。

我们有点太糖了,没发现 lucas 定理。

答案其实是

\[\sum_{i=0}^{n-k}\binom{k+i-1}{k-1}\binom{n-i-1}{k-1}\binom{m-i-1}{k-1} \]

你发现下面都是 \(k-1\),我们考虑 lucas 定理,然后用类似于数位 dp 的方式对 \(i\) 进行 dp,然后大概就行了。

? [mxr33 C]

不是很会。

大概想法就是你扔到 sam 上考虑,你发现答案肯定是这个 sam 里头最小的那个。

然后你再看合法的节点,发现是树上一个根的连通块,不过这个描述起来比较复杂。

~ [PR #13 A]

你要构造两个长度相同的 01 串,分别给定其中的 1 的个数,希望最小化循环位移之后,按位与得到的串中 1 的个数最大值。

\(n\le 5\times 10^5\).

你假装一个串已经确定,接下来要确定另一个串。

你发现,已经确定的一个串变成了一个印章,另一个串哪里有 \(1\) 就几乎相当于在哪里扣印章。然后你为了让最大值最小,肯定是要均匀地印印章。

阅读了提示,我们先猜一个答案。答案的下界,是首先会发生 \(kl\) 次匹配,然后把它们平均放到 \(n\) 个位置上,也就是 \(\lceil\frac{kl}n\rceil\)

观察样例,符合我们的猜测。

尝试进行构造。你发现,因为它是一个环状铺地毯,所以这个显然是可以被构造出来的。

我最开始的思路也没啥问题,接下来其实就是发现你给定一个印章也是很难做的,但问题是印章是我们自己定的。所以这个时候就要观察一个答案下界。

~ [PR #13 B]

\(2\times n\) 的 01 矩阵,你需要把所有 \(1\) 通过交换相邻两个位置给换到左上角去,问你最少要操作多少次。

还会有若干次修改操作,每次操作是交换两个格子。

\(n,q\le 10^6\)

首先你观察到我们可以避免没有用的交换操作,所以一定存在一个最优操作方案,使得操作次数就是起点和终点的距离之和。

接下来的问题就是,我们要最小化起点和终点距离之和。

如果我们已经知道集合 \(S\) 最终在上面那一层,那我们其实是知道这个距离之和是多少的,就是排序之后相减取绝对值。

同时我们知道,如果终点和起点不同层,其实就是最后加个 \(1\) 的事。

这个绝对值非常讨厌,你自然会想能不能把它拆掉。

你可以构造出来往左走和往右走的情况,并且似乎没有什么能拆的道理。

我们考虑现在已经确定最终上面有 \(x\)\(1\),下面有 \(y\) 个,首先,至少要发生 \(|x-s_0|\) 次上下之间的交换。

接下来我们把两行合并成一行,并声称此时的答案加上 \(|x-s_0|\) 就是答案。你想一下发现是对的。

然后你发现绝对值还是非常讨厌,我们把贡献拆到边上。具体来说,记前缀和 \(s_i,t_i\),那么答案就是 \(\sum|s_i-t_i|\),非常不幸的是,\(s_i\)\(t_i\) 的大小关系并不确定,也就是说绝对值仍然拆不掉。

剩下的问题是怎么确定 \(x,y\)。我们发现似乎很难讨论出结果,所以一个可行的思路就是用数据结构暴力维护。

首先对于初始状况,我们可以知道答案。

接下来考虑修改。如果只有操作 2,我们知道这个只是修改了 \(s_0\) 而已,相当于区间加。

如果加上操作 1,我们知道这只是对 \(t\) 的单点修改,但问题是它会影响很多地方的值。只不过这些值应该都可以通过对 \(s\) 的讨论分析成区间加,所以我们只需要线段树维护区间加和全局取 min 就可以了。

好复杂,不是区间加,大概是类似于区间加等差数列啥的,非常复杂,懒得做了。额不对,好像还是做原来的就行了。

很不错,虽然看到了一些提示,但是整体而言还是由我想出来的。这种一步步把问题简化的感觉很好。

? [PR #13 C]

这个不知道能不能做。

它要求第 \(k\) 大数和,我能想到的一个东西就是 minmax 容斥。这个东西直接做的话,就是设 \(dp_{i,a,s}\) 一类的,做到 \(O(n^4)\) 左右。

额接下来还有一个想法,就是我们记差分 \(\Delta_i\),相当于要求 \(\Delta_i\ge -1,\sum\Delta_i=n-m\)。问题是在这个视角下仍然不好处理 \(k\) 小的限制。

[ARC180 B]

这东西怎么这么神秘?

也就是说,我们相当于是在做一些交换,交换一对逆序对把它们变成顺序的,然后有一堆奇奇怪怪的限制,问你最多能操作多少次。显然有一个上界是逆序对个数,很不幸,这个上界不一定能达到。

奇怪的限制包括,这两个数不能距离太近,这两个位置不能之前已经被操作过。

如果没有距离的限制,事实上我们一定能构造出一个达到上界的操作方案。简单来说就是每次考虑能跟最后一个数构成逆序对的,然后按大小顺序进行一些交换,我们可以保证这样是合法的。

但是如果加上了距离的限制。

我会了。我们考虑加上距离限制之后的上界。因为每个点能跟前面交换的都是一个前缀,而这个前缀的值随着交换的进行是单调减的,所以上界就是最开始的情况。

怎么构造这个上界呢?我们按照后面那个数的大小来交换就行了。

感觉好像没有特别注意过不能操作已经操作过的位置,这东西有啥用吗?

有一个说法,是你考虑逆排列,然后相当于前面要比后面大,然后并且差还要超过 \(k\)。然后你发现这是逆序对,然后你就算一下,然后你尽量每次操作只干掉一个逆序对。

[ARC180 C]

很有意思的题目。

我们有一个思路是把操作规范化。经过研究,对于一个序列,首先真的被修改的位置是不得不进行操作的,然后我们发现两个相邻操作之间多加了几个 \(0\) 是没有意义的,因此我们都删掉。然后再强制钦定,如果中间不得不插入一次没有变化的操作,必须找到最近的位置。这样就可以 DP 了。

另外阅读了 sol 的做法,更好一点。它是我们只考虑真的被修改的位置,然后你考虑一下合法的条件就可以了。

[ARC180 D]

给一个序列,\(q\) 次询问区间 \([l,r]\) 内划分为三个小区间,每个小区间的最大值和最小是多少。

\(n,q\le 2.5\times 10^5\)

这个题非常有 CNOI 的感觉啊,让我想想怎么做。

首先一个好的想法是让我们考虑清楚划分为 2 个区间怎么做。显然,最大值是不得不取的,接下来我们希望剩下一个数尽可能小。如果最大值不在两侧,那剩下一个数就是最左最右两个数的较小值;否则,就是另一侧的那个数。然后你发现两个情况合并一下,就是 \(\max(a_l,\dots,a_r)+\min(a_l,a_r)\)

然后是考虑划分为 3 个怎么做。沿用之前的思路的话,最大值仍然是不得不取的。接下来我们分这个最大值在左中右区间三种情况讨论。

如果最大值在左区间,也就是说,左分界线要在它右侧。接下来就是要求 \(x\ge lim\),你要最小化 \(\max(a_x,\dots,a_n)+\min(a_x,a_n)\)

很容易让人想到把后缀 max 的单调栈搞出来,但是你发现这东西仍然不好被简单描述,那我们就先放到这里。

如果最大值在中区间,也就是说,左右分界线在它的两侧,那类似地,我们知道答案是 \(\max(a_l,\dots,a_r)+a_l+a_r\),这是简单的情况。

在右区间跟左区间没区别。

考虑进来区间的限制,我们思考一下怎么做左区间的情况。

那就是 \(lim\le x\le r\),最小化 \(\max(a_x,\dots,a_r)+\min(a_x,a_r)\),你发现就是加了一个 \(r\) 的限制。怎么办嘛,扫描线。

考虑 \(r\to r+1\) 的时候,这些值发生了什么变化。首先这个 \(\min(a_x,a_r)\) 你发现不好搞,但是不要紧,因为我们最外层是最小化,所以你开两个线段树,分别维护 \(\max+a_x,\max+a_r\) 取最小的就行了。

然后就是怎么维护这个 \(\max\),然后你发现这东西经典均摊一下就做完了。

? [ARC180 E]

这个东西就是,score 就是 lis 长度,cost 就是它有一些逆序对个数的限制,如果你满足不了其中的某一个就要承担 cost。

那我们分析一下,如果你已经确定 lis 的位置是哪几个了,我们考虑怎么填数能够让 cost 最小。

容易知道,lis 位置从小往大填,其余位置从大往小填,这样做一定能得到 cost 最小的。当然 lis 长度可能会变得更长,但是反正它要求的也只是 lis \(\ge k\)

那你有一个暴力的 dp,就是 \(dp_{i,j}\) 表示我们目前考虑到 \(i\),然后已经钦定了 \(j\) 个位置是 lis,cost 的最小值。转移只需要考虑当前位置要不要钦定是 lis。

我们先写个暴力看看对不对。

不对。不管了,自己看 sol 吧。

[CF1987 E]

怎么 mx 说好的比赛鸽到明天了,感觉也不会是啥好题。anyway,我们先看看这场 cf 吧。

额这个题怎么有点神秘的。

我们先来一个唐诗做法。你考虑设 \(f_u(x)\) 表示,为了让 \(a_u\to a_u+x\),我们在这个子树里至少要进行多少次操作。然后你感受一下这东西就应该是凸的。

然后转移就是你把儿子的 \(f\) 给求个闵可夫斯基和,之后根据初始时 \(a_u,\sum_{v\in son(u)}a_v\) 的大小关系,往最开头插入一段 \(0\),或者删除开头的一部分,然后整体斜率 \(+1\)

这么说的话,感觉有手段做到 1 log。

但是这做法也太麻烦了,咋可能 E 出出来这么一个题。所以肯定有更简单的做法,我们稍微想想看。

这里大概有一个贪心,就是因为这里有这么个凸性。我们由下到上,依次把每个子树都修改为合法的。所以说,修改到这个子树的时候,它的每个儿子子树都是合法的,我们此时一定是做一个从儿子到子树内某个点的链加。然后你发现这里显然有一个贪心:我们选择最浅的那个满足它还有“余裕”的节点,对这里做一个链加。

然后你发现,显然每个点都是从有“余裕”变得没有的。所以我们对目前的每个合法子树维护一个堆,就可以了。然后这样做大概是 2 log。

嗯,然后你发现这个贪心跟我们之前说的 dp 没区别。

[CF1987 F]

很有趣的题。

我们先记 \(b_i=a_i-i\),然后你发现问题变成了,你每次可以选择一个 \(0\) 位置,然后删除它和后面一个没被删过的位置,并把之后的位置都 \(+2\),问你最多能操作多少次。

有一个想法,首先所有奇数或者 \(>0\) 的都没救了,然后我们是不是能每次选择最靠右的一个能操作的,进行操作。

但是这样是不对的。你考虑一个 \(0,-114,0,-2,-114,-114\),显然最优策略是先删 \(0,-114\),然后删 \(-2,-114\),然后再删 \(0,-114\)

然后这个时候你发现这个删除,可以看成是类似于括号序列的东西,所以我们往这个方向靠拢。但是不是所有的括号序列都是合法的,我们对左端点有一些要求。

具体来说,你考虑一个连续的括号串,你发现它要求自己前面已经被删除了若干个数,然后才能操作自己。并且多了无所谓。所以我们尝试 dp 出每个区间想要被删干净,前面最少要被删了多少个数。

考虑如果是两个东西的并,我们合并一下就行了;如果外面套了一层,那么因为这一层必须是最后访问的,所以这就有一些要求。

仔细写一写,就过了。

[CF1987 G1]

\(n\) 个点 \(n\) 个边连出来的连通图是一个基环树,并且最大值只能连自环,所以连出来要是一个树。

然后,接下来所有点都不能连自环,除了这个限制以外,随便连。因为你随便连得到的一定是一个无环的东西,这东西大概就是一个树了。

现在相当于有一些点自然地选择了自己应该在哪里,剩下的点怎么选都是合法的,我们的目标是最大化直径。

有点想把笛卡尔树建出来。然后相当于每个点可以选择到底是要连到自己的父亲身上,还是连到往上跳直到遇到第一个反方向的边为止的点处。

为了简化这个问题,我们不妨直接取出来两个点,并且认为它们就是最后直径的端点。这样,最后直径的长度就只和这两个点到根的路径上的点有关了。

然后你看一眼,发现大概就会做了。让我们写写看。

额只跟这些点有关当然没错,但是这中间的折叠过程看起来还是挺复杂的,我还不太会。

额我会了,反正就是一些贪心往上跳跳跳,但是感觉我写得麻烦了一万倍。

sol 里面的做法跟我很不一样。

它也是在 lca 处合并,但是它不是这么考虑的。

它考虑到说,一定存在一个分界线,使得上升段路径在一侧,下降段路径在另一侧。这个结论在笛卡尔树上一看感觉还挺对的。

[mxr34 A]

这啥东西?我们发现 \(n,k\) 都很小。

\(k=1\) 是唐诗,但是 \(k=2\) 我就不怎么会做了。

首先有解一定要 \(deg\le 4\)。有一个唐诗 DP 是 \(O(2^npoly(n))\)

我们想想,能不能容斥。发现都没啥用。

然后你就找找性质啥的。发现如果你从小到大加入每个数,这整个东西几乎是一个连通块,但是也有很多其他的细节需要考虑。

不过就算真的是一个连通块似乎也没什么特别好的做法。所以我们转换思路,考虑能不能做一些神奇的复杂度。

你发现一个大小为 \(n\) 的子树从 \([1,m]\) 中选数,这样的方案数其实不是特别多。具体来说,是 \(\binom{n-1}{\min(n-1,m-n)}\),你感受一下,大概是一个可以存起来的数量级。

问题是合并是比较烂的,我不知道能不能分析出一些更好的结果,但是我现在不想看这个题了。就这样。

但是你感受一下,如果你已经确定我要用集合 \(S\),那么它的一个儿子 \(v\) 用的集合 \(T\) 其实应该没几种选择。

额,好像也不是特别对。因为当 \(n=28\) 时成功转移已经有 \(1e6\) 次了,\(n=50\) 肯定没啥救。

没准这个题真是正经题。

不是正经题,我怎么这么烂。

你发现上面的 dp 慢就慢在,一次更新了很多点。我们考虑一次只更新一个点,具体来说,我们从小到大往里填数,然后你发现填 \(x\) 的时候,必须填到 \(x-2/x-1\) 附近,所以状态数不是特别多。

是这样的,我们加了几个剪枝之后跑得飞快。

我很难受啊,场上其实想到可能不是啥正经做法了,为啥没有继续做下去呢?这个在 dp 当中转移多步复杂度很高于是就转移一步的做法,我们是很常见的。只不过应用场景稍微变了变就忘记了。

[mxr34 B]

你考虑怎么算一个区间的答案。发现首先要判合法,这个合法条件是,\(s_i=s_j\Rightarrow s_{n-i+1}=s_{n-j+1}\)。并且你发现这个东西关于对称轴有单调性,所以你就想给它求出来。

考虑我们新开两个数组 \(a_n,b_n\),分别存这个位置前/后面第一个跟它相等的位置到它的距离。然后如果我们判断 \([l,r]\) 是否合法就是一个类似于 hash 的东西。但是其实这个我不完全会做,因为你要把 \(\le l,\ge r\) 的东西修改成一个统一的值,这咋查 hash 啊。

额,也许你在主席树上可以做?

我们先假装自己求出来了所有合法区间。下一个问题是,一个合法区间的贡献是 \(m^{m-\# color}\),也就是说你接下来要算一些 \(\sum m^{-\# color}\) 的东西。看起来非常困难。

我们目前最有希望的性质就是,这东西是个合法区间。

我懂了。

我们考虑使用和 manacher 类似的东西,从前面继承已有信息。

然后你发现这个继承就直接继承就行了。

场上觉得 manacher 正确性其实不太好说,所以就想大不了可以 hash,然后假装自己知道了所有合法半径就行了。但事实上,这个很不一样的,manacher 就是能继承前面已经算过的东西。

不是感觉这两个题难度选得其实都挺正常甚至偏简单的,然后事实上确实有一车人切了,为啥我不会啊?

[CF1989 F]

\(n\times m\) 的矩阵,一次操作你可以选一行涂成红色,或者选一列涂成蓝色。

你可以一秒钟内进行任意多次操作,假设你这一秒进行了 \(k\) 次操作,如果 \(k=1\) 没有代价,如果 \(k>1\) 要支付 \(k^2\) 代价。每秒代价之和就是总代价。

接下来会动态添加若干个形如 \((x,y)\) 颜色为 \(c\) 的限制,每次都询问当前最小代价是多少。

\(n,m,q\le 2e5\)

注意到,我们只关心一行/列的最后一次操作时刻的相对大小关系。换言之,每个限制其实都是一条有向边 \((u,v)\),表示 \(u\) 要在 \(v\) 前面。

这样连出来一个有向图,显然一个 scc 必须同时进行,并且可以构造方案取到这个下界。

剩下的问题就是,动态加边,问 \(\sum_{v\in scc}[sz_v>1]sz_v^2\)。本质上就是要动态加边维护 scc。

这个我们有做法,类似于整体二分。

[mxr35 A]

我们考察什么是重要的。你发现对于一个状态,如果你接下来打算不捣乱直接还原这个排列,那么我们最少操作次数是去掉一个没有逆序对的后缀。所以我们可以考虑把状态设计为当前最长合法后缀是多少。

然后,考虑一次交换会给状态带来什么影响。你发现,如果当前是状态 \(x\),那么它可以转移到 \(1,\dots,x+1\),剩下的转移全都会转移到 \(x\) 本身。

换句话说,我们现在变成了有 \(n\) 个点,然后这么连边,然后问你走 \(m\) 次走回 \(n\) 的路径有多少条。显然有一个 \(O(n^3\log m)\) 做法,可以获得 60 pts。

考虑怎么做 \(n,m\le 1e7\),你注意到 \(m\) 没有开得特别大,所以可能不是啥矩乘一类的东西。

打表发现,答案是

\(m\) 个有标号球放入 \(n\) 个无标号集合,不要求集合非空,方案数。

显然有一个卷积做法。但是因为 \(998244353-1=2^{23}\times 119\),而 \(2^{23}\approx 8e6\),不够长,所以没办法卷积。

不会了,是不是有啥神秘观察然后就线性递推了。或者是不是可以把 \(n<m\) 的情况进行一些转化,转化到 \(n\ge m\) 然后做 Bell 数。

额,你发现我是小丑。

\[\sum_{i=1}^n\sum_{j=0}^i\frac{(-1)^{i-j}j^m}{j!(i-j)!}=\sum_{j=0}^n\frac{j^m}{j!}\sum_{i=0}^{n-j}\frac{(-1)^i}{i!} \]

就可以做了。处理 \(i^m\) 可以线性筛。

为啥老是犯同样的错误,就是老想当然觉得这个东西没办法做。你要真觉得没办法做,你倒是先把它写出来啊!

我有一个绝妙的解释。

就是你考虑到,只要把不合法的数全都进行一次操作,并且每次操作放入到唯一的正确位置,那么我们就能得到一个合法情况。换句话说,我们并不关心每次操作放到了哪里,只关心谁进行了哪些操作。

因此,把数当成集合,把操作当成球,往里头放。可以证明这与真实操作方案是一一对应的。

[mxr35 B]

你发现只有 AB 是没办法删掉的。

你发现一定删掉一奇一偶,并且每个字符的奇偶性不会改变。

因为我们关心最后能保留怎样的字符串,所以我们先想一个问题:指定一些位置保留,判定是否有解。

这个问题等价于问你每个区间能不能被删干净。考虑这样的问题怎么解决。

打表,大眼观察,猜测首先 AB 没法删,然后如果有一个没法删的串 \(s\),那么你在左侧加入偶数个 A,在右侧加入偶数个 B,或者拿另一个没法删的串 \(t\),拼接得到 \(s+t\),这些东西都是没法删的,并且所有没法删的串都可以这么得到。

然后就不会了,进一步猜的结论是错的。

我们的整体思路是规范化。但是似乎走不通。另一个思路是 dp of dp。

[mxr35 C]

咋看错成 burnside 的啊?

我们发现,它问的是经过操作仍然不同的方案数,或者说,不是自同构的方案数。那我们自然会想到一个容斥。

我们钦定一个操作集合,要算出被这个集合中任意一个操作之后都保持不变的方案数。

显然,对于旋转那边,如果我们钦定的东西的 \(\gcd\)\(d\) 的话,那么所有这些操作都完全等价于一个 \(d\) 的旋转操作。

剩下的问题只剩下对称这边了。你发现对称稍稍有一点困难。

我们猜测,在奇数情况下,有两个对称一定就寄了。所以就只剩一个对称一个旋转的 case 了。

在偶数情况下,我们可以构造出有两个对称但是有两个连通块的情况。你发现,这时对称也可以分成奇偶两种,如果只有偶对称,那最多也只能搞成两个连通块。

如果有一奇一偶两个对称,我猜直接就是连通块了;如果两个奇对称我猜也是。

所以剩下的情况就是,有若干个偶对称和一个旋转;或者一个奇对称和一个旋转。前者是容易的,只需要分讨旋转的奇偶性。

[mxr36 A]

不是,我咋啥都不会啊。

一个数 \(n\),两个人玩游戏,每次可以减去一个 \([1,sum(n)]\) 之间的数,其中 \(sum(n)\) 表示十进制数位和,不能操作者输。多次询问,谁有必胜策略。

\(T\le 10^4,n\le 10^{18}\)

显然我们要看 sg,并且我们只关心 sg 是不是 0.

打了表,没啥规律。只有 \(10 \nmid n\Rightarrow sg(n)\neq 0\) 是显然的。

那我们重点关心 \(10\mid n\) 的部分。

考察这个 sg 到底是怎么算的。如果我们维护一个值叫做 \(val_n=sum(n)-lstzero\),显然 \(val_n\ge 0\iff sg(n)\neq 0\),通过这个值我们也可以解释不是 10 的倍数的位置的规律。

所以你可以发现,进位是我们的头号敌人。

有一个递归做法。我们考虑到如果 \(sum(n)<10\),那 \(n\) 一定是 \(0\),所以就以这个为终止条件递归判断就行了。但问题是,为了判定 \(sg(n)\) 我们至少要知道 \(sg(n-10)\),这样下去,我们需要知道 \(sg(x),s.t. sum(x)<10\),你考虑如果 \(n=99999990\),这样的 \(x\) 是非常难找的。所以这个递归办法行不通。

再有一个出路,就是它可能有类似于分形的规律。或者它有关于 \(n-sum(n)\) 的规律,但是我确实都没看出来。

这种 sg 找规律的题,还有什么出路吗?

[mxr36 B]

神秘数据结构。

你有一个自然的想法是从两边不断删,但是删哪个呢?删错了就寄了,所以你不能随便删。

先考虑全局询问。

你有一个想法是维护,如果我右侧删到了 \(r\),那么左侧最大能删到哪里。这个确实是可以维护的,问题是不具有扩展性,没办法做区间询问。

额不对,具有扩展性。

我们考虑在 \(l\) 位置维护最小的 \(tor_l\),满足 \(S([l,r])=S(l,tor_l)\),然后询问的时候,我们查询一个位置 \(p\),满足 \(S([p,r])=S([l,r])\),然后询问 \([l,p]\) 的答案就可以了。

只需要使用线段树,复杂度 1 log。但是出题人明显脑子有问题,不开 O2 还开 1s 时限,懒得卡常了。

posted @ 2024-07-09 07:16  PYD1  阅读(11)  评论(0)    收藏  举报