本蒟蒻做不出来的思维题集合
[ARC122E] Increasing LCMs (difficulty: \(\textcolor{orange}{2535}\))
完全自闭。
首先想到最后一个元素的限制其实是很好确定的(所以这是怎么想到的啊),就是 \(lcm_{j \neq i} (a_j) < lcm(a_j)\)。后者是一个定值。容易知道每次扔掉合法的元素不影响最终构造。那么就做完了……吗?
没有,我们不能真的把LCM求出来。
所以拆开LCM,变成
把共同项约掉,得到:
如果把数按照唯一分解定理拆开,会发现其实就是把不是 \(a_i\) 的项的指数取 \(max\) ,再和 \(a_i\) 取 \(min\),那么我们调转这个过程,变成先取 \(min\) 再取 \(max\) ,得到:
就可以了。
[CF888F] Connecting Vertices (difficulty: \(*2500\))
感觉无比逆天。完全不知道怎么才能想到。
首先一眼区间dp对吧,记录 \(dp_{l, r}\) 表示把 \([l, r]\) 连接成一棵树的方案数。
(虽然这个题可以和生成树没有关系但是还是这么想好了。)
然后是逆天的部分:分l和r是否用一条边连接讨论。如果是,记为 \(dp_1\) ,否则记为 \(dp_0\)
\(dp_1\) 是容易的。如果 \(a_{l, r} = 1\),\(dp_{1,l,r} = \sum_{mid = l} ^ {r} (dp_{0, l, mid} + dp_{1, l, mid})(dp_{0, mid + 1, r} + dp_{1, mid + 1, r})\)
\(dp_{0}\) 则涉及到各种各样奇怪的问题。怎么划分区间呢?
答案是分 l连出去的最靠近r的一条边的端点讨论 (不要问我为啥是这样/kk)
\(dp_{1,l,r} = \sum_{mid = l + 1} ^ {r - 1} (dp_{1, l, mid})(dp_{0, mid, r} + dp_{1, mid, r})\)
答案是 \((dp_{0, 1, n} + dp_{1, 1, n})\) 。
[LOJ6383] 是男人就过8题之七:PerfectNPArray
差点性别都给改了,身败名裂
树上求合法括号序列的层数最大值。
这个题两个限制都很烦人。“任意前缀和大于0”具有任意性(废话),而各项和为0又是一个很紧的限制。
这个时候我们要敢猜!画几个不合法的图出来!不合法的一定不优!
原因还算显然:如果取得最大值的位置在前缀和小于0的位置之前,那么就一定可以删掉包含该位置的一段后缀。否则就可以删掉包含该位置的一段前缀,使答案不会更劣。
这个时候我们已经有基于淀粉质的 \(\Theta(n \log n)\) 的算法了。只需要对于每一个前缀和 \(i\) ,去 \(-i\) 的桶里找最大层数就行了。
但是楼教主没有放过我们!数据范围 \(5e6\) !
只能DFS了!
我们自然可以对于每个根进行一次DFS,路上求出最大层数和子树里是否有前缀和为 \(0\) 的点。但是不能扩展!我试过,这个算法是不支持换根的。
咋回事呢?难道真的就要改性别了吗?
上当了!我们太习惯于在路径的端点/根/LCA这些地方统计信息,正像 \(dp_i\) 从 \(dp_{i - 1}\) 转移。正像构造数列从前往后,正像区间DP枚举第一个位置。问题是,谁告诉我们是这样的?
OI不仅需要脚踏实地的推理,还需要天马行空的想象和的不拘一格的猜测。 取得层数最大值的位置才是我们应该枚举的对象。那么我们需要维护的就是子树内往上和(这样就不是前缀和)的最大值和最小值了!这个是支持换根的,需要维护最大值/最小值,次大值/次小值,最大值最小值的出现位置。注意因为是点权有一些奇怪的细节。答案就是 \(min(-mn_i, mx_i)\) 。
[ARC150D] Removing Gacha (difficulty: \(\textcolor{orange}{2407}\))
【我也没有秒这个题,我才做了40min】.jpg
【我不会这个题,但是我猜到了结论】.jpg
萌新在巨佬们中间瑟瑟发抖。
感谢 \(\textcolor{black}{是}\textcolor{red}{青白呀}\) 大佬的帮助。
首先这个题的树的形态没有意义对吧,贡献只和每条链有关。确切的说,是和深度有关。
那么我们单独分析点 \(x\) 到根的链。
进入玄学领域。
如果我们允许选中好点,且不算它的贡献,那么答案不变。
那么我们观察 \(x\) 到根的链,它什么时候被选完呢?
假设当前被选了 \(i\) 个点,那么选到一个被选到的点的概率为 \(\frac{d - i}{d}\) 。根据经典结论,期望选择的次数为 \(\frac{d}{d - i}\) ,那么总共选择的次数就是 \(\sum_{i = 0} ^ {d - 1}\frac{d}{d - i} = \sum_{i = 1} ^ {d}\frac{d}{i}\)。
这些选择次数中,期望有 \(\frac{1}{d}\) 选择了 \(x\),那么 \(x\) 对答案的贡献就是 \(\sum_{i = 1} ^ {d}\frac{1}{i}\)
答案就是 \(\sum_{x = 1} ^ {n}\sum_{i = 1} ^ {d}\frac{1}{i}\)
[IOI2022] 千岛 (difficulty: \(\textcolor{black}{i}\textcolor{red}{nfnity}\))
膜拜传奇特级大师 \(\textcolor{black}{是}\textcolor{red}{青白呀}\) 大佬,今,一,您,扬,向。 byn要逆天了——Chery
样例启发我们:任何一个环都能帮助我们走一圈,再回到出发点,这个时候只有这个环上的点反向了,这个时候如果能再次到达这个环上就构造出解了。
但是怎么找到一个环呢?
出度为 \(0\) 的点没有意义,可以忽略。那么我们跑一个拓扑排序,迭代删掉所有出度为 \(0\) 的点。如果 \(0\) 号点被删了就无解。
比较舒服,我们可以从任何一个点出发,随机游走,都能走到一个环。
如果走到这个环又回到 \(0\) 号点之后,不能再出去,那就无解了。
否则我们就可以再出去一次,我们希望这一次出去能走到那个环上。
但是冷静想想,不走到那个环上真的不行吗?
不是的,我们当然可以走到另外的环,起到浪费步数的作用,又回到 \(0\) 号点之后重复一次刚才的过程就好了。其中环上的点要反向。
但是又想想,\(0\) 号点出度为 \(1\) 真的无解吗?
当然不是,我们可以出度为 \(1\) 的点往下走,走的路径唯一。同时删掉经过的这些点,感性理解一下这个很对。直到走到第一个出度至少为 \(2\) 的点——或判断无解。
那么这道题就做完了。这题IOI现场就 \(5\) 个人过,是 \(2022\) 年最难的一题。恭喜你吊打了hehezhou。
[HNOI/AHOI2018] 排列 (difficulty: \(\textcolor{purple}{省选/NOI-}\))
或许当我问出“这个题是从下往上做还是从上往下做”的时候我就已经输了吧。
容易转化成树上问题。父亲节点必须在儿子节点之前选
考虑如何贪心。从上到下,从下到上都是不对的。估计很难意识到这一点。
怎么办。完全无法在这道题上推进一步了。
找到特例,推测性质。
很难想到,但是 当全局最小值可以被更新的时候一定会选择全局最小值
证明不难。考虑邻项交换,交换最小值和在它前面的一个数,答案会增加二者的差。
好,先把最小值和它的父亲"绑定"作为一个整体。
你发现了普遍规律,但是这个规律是很强的。
怎么更进一步。
既然你合并了两个点,那么这两个点可以看作一个点吗?
恭喜你回答正确。这两个点视作一个整体,可以把它的点权视为二者点权的 平均值。
为什么?
考虑邻项交换。在交换前,代价是:
考虑邻项交换。在交换后,代价是:
两者相减,变化量是:
如果变化量为正,当且仅当
这构成偏序关系,得证。
[省选联考 2020 B 卷] 丁香之路 (difficulty: \(\textcolor{purple}{省选/NOI-}\))
神题,真的是神题!
给你一个图,图的边权是 \(\mid i - j \mid\) ,问从 \(s\) 必须经过指定边到达终点的最短路。
首先这个题一看就很不正常对吧。没有很常规的东西能分析这个 。
那就先把所有指定边先加起来再说。
你会剩下一些点,这些点需要被连接起来。
如果一个点被连接了两次,四次,,,偶数次,那么每条到达它的边都可以被连接走。那么我们先不管这些点。
我们只管那些被连接了奇数次的点,其中起点和终点的奇偶情况要翻转。
这下可以编出一个看起来很对的东西:两两配对连接。
但你会发现过不了第三个样例:你连出来的图不连通。
咋办,假了?
考虑你刚才干的事情的本质是什么。把奇数度数的点两两配对,这就相当于先连上一条起点到终点的边,对剩下的部分补全成“广义的欧拉回路”。
但是度数全是偶数是不能保证回路连通的,但是感性猜测一下,这些边是必须连的。但是为了尽量保证连通,你把这些边分拆到长度为 \(1\) 的边上一定不劣。
现在问题就是:你有一些连通块(注意不是连续段,因为可能有跨越很长的必须经过的边),用最小的代价连通他们。
对!最小生成树!就是这样,恭喜AK省选联考2020。虽然是B卷就是了
自然是真的自然,想不到是真的想不到。
[Ynoi2010] y-fast trie (difficulty: \(\textcolor{purple}{省选/NOI-}\))
orz zhouwc。
首先这个取模是诈骗,我们可以对每种数进行一个先取模再加入多重集。这个时候只会有两种情况:\(i' + j' - C(i' + j' \geq C)\) 和 \(i' + j' (i' + j' < C)\)
前一种非常弱智,只有最大的两个值有用。
后一种如果支持离线,我们可以轻易地得到一个 \(\Theta(n \log ^2 (n))\) 的做法。只需要对每个元素维护最优匹配即可。
虽然这题在线,但是“最优匹配”这个想法十分的好!
结论:可能最优的匹配只可能是双向的。
证明:如果存在 \(i\) 的最优匹配是 \(j\),\(j\) 的最优匹配是 \(k\) 那么如果选择 \((i, j)\),不如选择 \((j, k)\) 。
真就 \(\Theta(inf)\) 枚举做法 \(\Theta(1)\) 验证呗。
这意味着每次我们只用删掉一个数。
实现:拿map和set乱搞亿下就行了,注意把 \(i \bmod C = j \bmod C\) 分开处理会方便一些。
[ZJOI2018] 迷宫 (difficulty: \(\textcolor{black}{NOI/NOI+/CTSC}\))
先喊三声“\(\huge{\textcolor{red}{吉老师牛逼}}\)”。
这个题我并不能完全理解,但是鉴于网上的所有题解连让我感性理解都不能我觉得我还是很厉害的.jpg
先转化成自动机形式的题意。
显然的构造是:每个点 \(i\) 放所有 \(S \equiv i \pmod K\) 的字符串。但是无法保证最小。
所以我们开始“缩点”。把自动机上等效的结点合并成同一个,似乎最小方案一定可以这样得到。缩一缩就发现如果两个点 \(i,j\)满足 \(mi \equiv mj \pmod K\) 那么这两个点显然会被缩到一起。('0' 号结点除外),它和任意其它节点可以区分。
这个条件大概等价于 \(\frac{K}{\gcd(K, m)}\) 整除 \(\mid i - j \mid\)。所以点与点的等价关系是以 \(\frac{K}{\gcd(K, m)}\) 为周期传播的。
然后我们会发现大概得到了0分的好成绩,因为这个过程是迭代的。缩完一次点还可以再缩。也就是可能 \(m^2i \equiv m^2j \pmod K\)
那么我们就考虑怎样迭代的解决这个问题:我们发现:每一次如果一个点 \(i\) 满足 \(mi + [0, m - 1] \equiv 0 \pmod K\)
那么它就无法进入第二轮缩点,因为它和其它点一定在第一轮就区分掉了。
我们观察一下,所有等价类的点的编号乘以 \(m\) 再模 \(K\) 有什么特点,发现这些值排序后是 \(\gcd(K, m)\) 开始的一串等差数列,所以最大的
\(\frac{m}{\gcd(K, m)}\) 个数会能够走到 \(0\) 这个位置(不太显然,感性理解。。。)然后就需要把这些数减去就行了。
然后进入下一轮。这个时候我们把这些新点按照 \(im \bmod K\) 重新编号,进行排序。
但是我们的新点编号不连续了,所以我们把这些新点的编号也除以 \(\gcd(K, m)\),同时,模数除以 \(\gcd(K, m)\)。
注意,每一步能走到 '0' 点的点数是 \(\frac{m}{\gcd(K, m)}\) 累乘起来。因为如果上一次缩点后,会有 \(A\) 个点因为能走到 \(0\) 被区分,这一次每个点都会对应 \(\frac{m}{\gcd(K, m)}\) 个点能到达它。(感性理解,感性证明。。。)
代码大概500b。
点击查看代码
ll ans = k, m = 1, ub = k - 1;
while(ub > 0) {
ll d = __gcd(n, k);
ll T = k / d;//周期
if(ub <= T) {
break;
}
ans -= (ub - T);
if((T / m / (n / d)) == 0) {
break;
}
m *= (n / d);
ub = T - m;
k /= d;
}
[JXOI2018] 守卫 (difficulty: \(\textcolor{purple}{省选/NOI-}\))
yet another 吉老师题。
关于这道题最困难的一点可能是知道正解“不是什么”。而不是知道正解“是什么”。
我常觉得OI既需要高超的思维演绎能力,也需要在毫无落脚之地的时候纵身一跃的勇气。
对这道题的感性理解:这道题一定是 dp ,dp 状态一定是 \(dp_{i, j}\) 表示把 \([i, j]\) 全部监视完毕的最小人数。转移好像不太会列。
这道题的无脑结论:一个区间一定会选右端点。
这个时候告诉自己:好,这就够了。开始推导。
右端点选择之后,可以看到一些位置。这些位置和右端点的连线的斜率单调上升。
如果区间的左端点能被右端点看到,那就太好了。答案和左端点 \(+1\) 的情况没有任何改变。
不是这样呢?那么某个区间内最后一个可以看到的位置 \(pos\) 会把整个区间劈成两半,左右两边不可能互相看到。这个是容易证明的。
不可能看到的关系把整个序列分成了两半。那么 \(pos\) 的抉择就尤为关键。它或将成为照亮左方的明星,或将使左方彻底割裂。
[CF1889D] Game of Stacks (difficulty: \(\textcolor{purple}{省选/NOI−}\))
优雅,永不过时!
这个题看起来没有任何性质。整个 \(n\) 次过程毫不相干。
寻找突破口。假如 \(\forall k_i = 1\) ,那么整个图相当于一个内向基环树森林,每个点的答案就是它开始走,走到环上的第一个点。
这个看上去没有任何启发性,因为 \(k_i > 1\) 使得这张图错综复杂,每个点可以被多次经过。
但是,如果我们从某个点开始,绕一圈回到了自己,那么整个环上的点全部可以被忽略:不管以哪个点为起点都是这样。

好的,恭喜你吊锤了tourist。

浙公网安备 33010602011771号