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}\) 表示方案数。这个方案数,我们可以枚举上面有多少个有值的位置,然后做一做啥的。
额,然后你会了一个平方做法。烂完了,起码来个线性吧。
另一个做法是考虑二元 OGF,经过一番推导之后发现是 \([x^{n-k}y^{m-k}](\frac 1{(1-x)(1-y)(1-xy)})^k\),显然的一个做法是我们枚举 \(xy\) 项选了多少个,然后剩下的就独立了。
感觉要做 \(1e18\) 是不是怎么着都得上点科技啥的。
其实不需要。
我们有点太糖了,没发现 lucas 定理。
答案其实是
你发现下面都是 \(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 数。
额,你发现我是小丑。
就可以做了。处理 \(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 时限,懒得卡常了。

浙公网安备 33010602011771号