嘴巴记录
状态不佳时会嘴巴,题目来源非常随机。
P2312 [NOIP2014 提高组] 解方程
艹好难啊。
大概知道是秦九韶公式转化一下,但是发现这个 \(a_i\) 大的离谱,所以我们就想到用质数取模。
然后我们就取若干个大质数判断是否正确就行了。
经巨佬 \(\text{DPair}\) 来自过去的尝试,若干等于一。
复杂度是 \(O(nm)\) 的。
CF1214F Employment
这道题我咕了很久了,感觉是一道 \(\text{NB}\) 题,不 wei 做。
首先猜测一波,人与对应办公室的相对位置是相同的。
放屁,好像可以随便 \(\text{hack}\) 。
好像存在一个费用流模型,是否意味着我们可以模拟费用流?
哦相对位置是相同的,我的 \(\text{hack}\) 数据实际上可以转化成相对位置相同的。
首先我们考虑破环成链。
然后我们考虑直接维护每一个点对于每一个平移距离的答案的贡献,然后直接维护就行。
P2000 拯救世界
好像是生成函数。
我们就直接考虑用生成函数来表示这个选择的过程。
第一种大阵:
第二种大阵也应该是类似的,然后你把两个加起来,消消减减应该就能得到一个比较优美的式子了。
SP1479 PT07C - The GbAaY Kingdom
大意是给你一个无向图,边有非负边权,让你把他变成一棵树,使得直径最小。
搞了半天是最小直径生成树板子题。
https://oi-wiki.org/graph/mdst/
先咕咕咕。
P6499 [COCI2016-2017#2] Burza
这题好像是 XJ 模拟赛题欸,但是我已经不 wei 做了。
首先深度小于 \(k\) 的应该可以直接忽略,同时大于的部分也可以直接砍掉。这样的话我们就得到了一棵树,其所有的叶子都是深度为 \(k\) 的。
考虑将所有叶子按照 \(\text{dfs}\) 序排列。然后你发现如果你做一个深度由深到浅的扫描线,他会出现的事件就是两个点被合并成了一个点。
那我们是否双方都是贪心的走?感觉不一定。
我们可以知道,每一次走的都是次优点,因为最优点会被删掉。那这里的最优次优怎么定义?好像只有 \(01\) 两种权值,表示能否选出。
我们怎么感觉这样是对的啊。
这个题面翻译有点垃圾。
这里的 \(Daniel\) 是不能得到对方的操作信息的。
那还是对树先做这样的处理。
首先有一个易得的结论,就是你每一个标记的深度必然就是这个标记放置的时间。
就是直接利用这个结论进行状压。
但是你会发现 \(k\le400\) 并不能状压。
但是实际上考虑最坏情况 \(k\) 条长度为 \(k\) 的链,所以 \(k\) 是 \(\sqrt n\) 级别的,所以是可以搞状压的。
关于这里最坏情况为什么是这样的,我个人认为是因为首先一个叶子必须是深度为 \(k\) 才有效。其次,我们要尽量使得他单个标记能够影响到的叶子数量尽量少。
存在一个简易的证明就是,由于你已经将树转化为了只有深度为 \(k\) 的叶子的树,那么每次给一个深度为 \(i\) 的节点打上标记,就会使得 \(k-i+1\) 个节点被删掉,所以 \(k\) 是 \(\sqrt n\) 级别的。
\(\text{dp}\) 的过程实际上就是用 \(f_{u,i}\) 表示子树 \(u\) 中深度集合为 \(i\) 的深度都已经被选过了。
然后转移的话也就是我们通过在 \(\text{dfn}\) 序上转移然后求解即可。
CF1290F Making Shapes
首先很重要的一点是需要得到一个凸多边形。所以我们可以先按斜率排序。
然后比较容易得到的,我们只要选出一种组合,满足两个坐标的运算相加为 \(0\) ,那么必然其唯一对应一个多边形,这样实际上就变成了一个数数问题,有多少个选择方式可以使得两个坐标的和为 \(0\) 。
但需要注意的是存在坐标范围的限制,所以我们还是按斜率从小到大选为妙。
这道题目也太神奇了吧。
首先我们在上面的考虑方向是对的,如果我们设第 \(i\) 个向量取了 \(c_i\) 个,那么实际上我们就需要满足下面这四个式子。
然后我们要求满足要求的 \(c_i\) 的个数。实际上这个东西可以数位 \(\text{dp}\) 来求。
我们直接考虑枚举当前二进制下的每一个 \(c_i\) 的第 \(k\) 的是 \(0\) 还是 \(1\) ,然后你就可以通过计算,得到你当前位的 \(c_i\) 的贡献,但是仅有这个还不够,因为我们需要满足一个上界和正负相同,我们再多记录几个状态表示目前为止,两个维度的正负分别存在多少的 \(c_i\) 的贡献还没计算在内(实际上可以理解为还没有计算的进位),因为我们对于 \(m\) 的贡献统计也是利用类似于数位 \(\text{dp}\) 的想法通过计算得到当前位的 \(m\) 的取值,然后利用常见的数位 \(\text{dp}\) 套路,设两个 \(01\) 位置表示两维是否顶满 \(m\) ,然后转移即可。
P4331 [BalticOI 2004]Sequence 数字序列
这是(不是,update by 刘涛)一道保序回归。
注:这道题我很早就想写了,但是出题人卡两只 \(\log_2n\) 的启发式合并,卡线段树合并的空间,一定要写左偏树,而我不会左偏树,所以只能爪巴了。然后第一篇题解是我看不懂的一个做法,先咕咕咕。好像还有一个整体二分,也咕咕咕。
感觉这道题目像一个巨大猜猜题。
首先我们考虑如果是求不下降序列的 \(b_i\) 怎么做。
实际上我们可以得到两个结论:
- 如果 \(a_i\) 也不降,那么 \(b_i=a_i\) 。
- 如果 \(a_i\) 不升,那么 \(b_i\) 等于 \(a_i\) 的中位数。
证明略。
这样我们就可以将这个序列拆分成若干个单调的区间,然后分别求出其答案,再合并。
不难想到,由于我们最后的 \(b_i\) 是要求不降的,所以如果两个相邻区间的答案是降的,我们就考虑合并他。直到不能合并为止。证明,不会,也许保序回归的论文里有。
CF1491F Magnets
首先我们返回的就是两边磁石磁力和的乘积。
我们首先考虑随机选择两个放在左右两端,如果是存在磁力强度的,说明两个都不是 \(0\) ,我们只要取其中一个然后扫一遍全部的就行了。
所以这个交互次数启示我们,通过 \(\left\lfloor\log_2n\right\rfloor\) 次操作找到一个非 \(0\) 的位置。首先由于存在相加可能等于 \(0\) 的情况,所以除非是两个单独进行测试,否则我们不好判断是否全 \(0\) 。假设我们就只有两个磁石有磁性,且磁性相反,我怎么找到他们?
首先,我们无论怎么划分都是 \(0\) 。
我们考虑分成两半,然后查询,然后再分成两半,其中一三放一边,合并二四放另一边,然后查询,以此类推。
然后查出来之后,用其中一边查询另一边就行了。
诶呀,忘记了磁力强度的限制,而且好像有问题。
卧槽,\(\text{NB}\) 啊。
你考虑从 \(2\) 开始,每次查询 \(S=\{i\}\) ,\(T=\{1,2,\cdots,i-1\}\) ,这样的话直到 \(i\) 是从左往右第二个有磁性的磁铁才会查询到非零值。
然后如果我们找到了第一个磁铁的位置,我们实际上就可以得出 \([1,i]\) 所有的没有磁性的磁铁的位置了。这个直接二分。

然后你考虑剩下的扫一遍就行了,查询次数是 \(n-1+\log_2n\) 的。
CF1355F Guess Divisors Count
什么毒瘤。。。
首先如果是求因数个数的话,可能是需要求出每一个质数的个数的,所以我们可能需要一堆质数一起问。
等下,为啥答案还是可以存在误差的啊。相差小于 \(7\) 或者是 \(\frac{1}{2}\) 到 \(2\) 倍之内的误差。
首先后者就启示我们,大于 \(\sqrt{10^9}\) 的质数就不用考虑了,正好是两倍的误差。
我们能否考虑一开始将答案就乘 \(2\) ,这样的我们就可以少记录两个质数。
这又启示我们,对于大于 \(\sqrt[3]{10^9}\) 的质数,我们实际上也不需要算?我们就考虑大于 \(\sqrt[3]{10^9}\) 的质数最多出现两个,最多贡献正好是 \(4\) 。
现在质数的上限就被我们压到了 \(1000\) ,发现此时质数存在 \(168\) 个。然后我们考虑怎么询问呢?
我们注意到 \(\sqrt[4]{10^9}\) 以内的质数个数正好是 \(40\) 个,而这个时候我们两两分组询问就可以得到答案了。
这就启示我们怎么快速判断 \((\sqrt[4]{10^9},\sqrt[3]{10^9}]\) 之间有没有质数,以及相应的因数贡献。
意识到我可以先通过询问一次 \(\prod_{i=1}^{15}p_i=614,889,782,588,491,410\) ,得到这一部分的质数有没有。
看了题解,发现基本都是乱搞,艹。
哦实际上我的做法已经基本正确了,就是分析质数,然后通过询问质数是否存在(一堆质数一起问),询问质数的幂次两种方式来搞,这样最大可以搞到 \(900\) 左右,然后由于前面的分析,然后直接判断剩下部分的影响必然不大,微调一下就行了?
那么剩下的情况:
- \(1\),最终答案只多乘了 \(2\),没有问题。
- 质数,最终答案乘了 \(2\),刚好。
- 质数的平方,答案应该乘 \(3\),但只乘了 \(2\),差距没问题。
- 质数乘质数,应该乘 \(4\),少乘了 \(2\),没问题。
- 三个质数相乘,但我们发现,如果是三个 \(900\) 以上质数相乘那不可能有其他质因子(\(\times 2\) 就大于 \(10^9\) 了),那么答案至多为 \(8\),然而我们输出的 \(1\) 也在可接受范围之内。
所以这样是正确的。
什么乱搞题。🤬🤬🤬🤬🤬🤬🤬🤬🤬
CF1012D AB-Strings
首先,必然可以证明,我们每一次交换的前缀都是全 \(a\) 或全 \(b\) 或空的?
分讨题。https://www.cnblogs.com/zhouzhendong/p/CF1012D.html
SP3734 PERIODNI - Periodni
发现 \(n,k\le500\) ,感觉可能大有可为?
神 \(\text{DPair}\) 直接秒了,我是菜鸡。
感觉像是区间 \(\text{dp}\) ,我们考虑一行一行填入,这样的话到达了一定的高度的时候,不连通的块之间是不会互相影响的。就直接算就行了?
为啥会有组合数啊,有点没搞懂。分治和背包想到了,复杂度分析错了,这个组合数也没想明白。。。
我有点想写个代码。这是嘴巴记录。
哦,我悟了,实际上是一样的,就是合并每一层上方互不干扰的部分,然后一起考虑的部分是通过组合数计算方案数而已,而组合数的计算方法就是选出若干行若干列,然后两两组合的方案。
CF627D Preorder Test
是二分吗?
考虑二分的话,我们就可以将树上的节点分成两类,大于等于的和小于的。
然后我们考虑直接 \(\text{dp}\) 算出每一个子树向下 \(\text{dfs}\) 能到达最多的有效节点个数。
然后就行了吧。
发现需要指定树根,直接套一个换根就行了。
P5048 [Ynoi2019] Yuno loves sqrt technology III
首先,如果是并非强制在线的话,就是回滚莫队的板子题了。
我们考虑莫队的在线化,实际上就是预处理出每一个整块区间的桶,再然后暴力移动端点,然后你发现这样空间复杂度堪忧。
但是我们依旧还是可以算出整块区间的答案的,这个可以 \(O(n\sqrt n)\) 预处理。
但是问题就在于我们移动的时候是需要一个桶的,但是空间不能够支持我们这样做。
这里的思路就是考虑散块的贡献,因为我们可以快速回答一个颜色在区间内的个数。然后这里我们尽量做到 \(O(1)\) 回答。
我们就直接维护出每个元素从左往右的下标,我们查询一个位置,就直接考虑找到这个位置之后 \(ans\) 个该元素的位置,并于右端点比较,同时更新 \(ans\) 并继续这一步骤。
BZOJ3563 DZY Loves Chinese
什么吊题。
问你一个无向连通图在删去 \(k\) 条边后是否联通,\(n\le 10^5,m\le 5\times 10^5,q\le 5\times 10^4,k\le 15\) 。
我们考虑先建一个生成树,这样的话删掉若干条边不连通存在两种情况:
- 该树边与覆盖其的非树边均被删除。
- 两条树边被删除了,且非树边均同时覆盖这两条树边。
我们考虑怎么维护?实际上不太好维护,前者实际上我们用树剖线段树可以搞,但是后者我们好像没办法直接搞。暴力的方法就是维护每一条边被覆盖的非树边的集合,然后暴力 \(\text{check}\) 。意识到 \(k\le 15\) ,所以我们能否利用二进制来维护这个集合?
实际上是可行的,我们需要满足删掉的边集里不存在线性相关的点。这与上面我们提到的两个判定情况是等价的。
于是我们就在 \(O(m\log_2m+qk^2)\) 的复杂度解决了这道题。
CF1292F Nora's Toy Boxes
存在三个数满足两个数是另一个数的倍数的情况下,我们可以删去两个倍数中的一个,问删除最多数的方案数。
首先如果 \(a_i|a_j,a_j|a_k\) ,那么删去 \(a_k\) 必然不劣,但是由于两者是可能等价的,我们不能直接武断这个一定删去 \(a_k\) 。
我们先考虑建成一个图,我们应该是可以得到一个 \(\text{DAG}\) 的。
首先我们可以断定终止状态应该必然是若干个不连通的大小为 \(1\) 或 \(2\) 的图,那必然的,如果一个 \(\text{DAG}\) 存在历史的大小大于等于 \(2\) 其就必然不能变成一,这样的话所有图的最终状态就都是 \(2\) 了。
欸,那我们是不是就求出了删除的点数。真的每一个图都能被删成 \(2\) 吗?就按照拓扑序来删就行了吧。哦,如果一张图存在多个零出度点,可能的最终情况就会改变。
就比如一个菊花且菊花的中心入度为 \(0\) 。
哇,非常 NB 的一道题。
首先转化 \(\text{DAG}\) 的步骤是正确的,然后考虑最终状态的图是怎么样的,实际上对于一个若连通块就是一堆入度为 \(0\) 的点再加上一个其他点,这样必然是最优的,我并不会证明,你可以手玩一下。
然后我们考虑如何构造方案,构造方案的方法很是神奇,大体就是我们考虑将删点变成加点,如果所有的点都被加入了,那么就必然可以通过反向进行这个操作删除点。
首先可以比较轻易的得到,所有的点都可以通过入度为 \(0\) 的点进行操作来得到,但是一个入度为 \(0\) 的点能够进行操作的前提就是已经存在一个点指向他,这个实际上我们是可以 \(\text{dp}\) 的。
首先入度为 \(0\) 的点的个数是可以证明必然小于等于 \(15\) 的,所以是可以状压的,我们考虑状压当前哪些入度为 \(0\) 的点是已经可以进行拓展操作了。
然后如果不改变激活状态可以乘上系数 \(cnt_{S}−i\) ,如果改变了激活状态,枚举下一个加的点并转移。
太酷了,sjy NB !!!
CF1606F Tree Queries
突然觉得是可以 \(\text{dp}\) 的,我们考虑在 \(k\) 固定的情况下怎么搞。
我们定义 \(f_{u}\) 表示子树 \(u\) 的最大答案是多少。
哦,然后这个 \(\text{trick}\) 应该就是离线下来之后随着 \(k\) 的变大,\(\max\) 的取值在 \(k\) 超过一个值之后就固定了。跟 P7897 [Ynoi2006] spxmcq 很像。
对,然后用一个类似于堆的东西维护会改变取值的 \(k\) 的临界值并修改,然后离线查询就行了。
CF555E Case of Computer Network
定向无向图要使得所有的给定的点对 \((s,t)\) ,\(s\) 都可以到达 \(t\) ,只需要输出是否可行。
哦,感觉就是求一个割边,然后判断割边是否会被定向两个方向就行了吧。
我竟然被万老爷提示才做出来,我是猪。
CF1499F Diameter Cuts
咦,一眼树上 \(\text{dp}\) ,感觉细节颇多。
感觉这个直径不是很能在 \(\text{dp}\) 过程中维护。。。哦,我悟了,就直接是两个点集并在一起的直径维护方式就行了,每次加入一个点,但是这样我的状态数是 \(O(n^3)\) 的。
哦,由于我们每次是将两个有边连着的点并在一起的,所以我们实际上只需要维护两个中最深的点是多深就行了,同时在合并过程中满足不会超过 \(k\) 即可。
如果暴力合并的话,合并的复杂度是类似于树上背包的。
感觉可以长剖优化,但是有点忘记了,我先去回忆一下。
我们考虑轻儿子暴力枚举其深度,我们的要求是重儿子深度 \(x\) 和轻儿子深度 \(y+1\) 的和 \(\le k\) ,并且将方案数放在 \(\max(x,y+1)\) 的位置上。
这个我们考虑用线段树维护重链,然后分类查询即可。
应该是可以低于 \(O(n^2)\) 的。
CF1088D Ehab and another another xor problem
观察到 \(a,b\le 2^{30}\) ,而询问可以有 \(62\) 次,应该是需要我们两步左右确定一位。
考虑从高到低确定,然后每次扰动一下就行了吧,应该是需要分类讨论的。
我们令 \(a=p2^i+m,b=q2^i+n\) ,应该是可以分讨出来的。
P4755 Beautiful Pair
感觉是要对于右端点,维护左端点的情况。
我们考虑每次加入一个位置的时候,实际上就是给我们一段后缀更新其 \(\max\) 。
哦,然后我们可以用 \(\sqrt a_i\) 的时间找到所有可能的 \(\lceil\frac{a_i}{a_j}\rceil\) 的取值。
绷不住了,万老爷用 \(20s\) 直接秒了。
我觉得我需要换一个思路,考虑类似于 \(\text{cdq}\) 分治的思路来搞?
应该是建出笛卡尔树之后用启发式合并来搞就行了吧。
然后发现实际上应该是不需要建出笛卡尔树的,因为子树就是对应一段区间。然后我们直接用主席树来维护应该就是可以的了。
CF1205D Almost All
卧槽,什么弔题?
首先我们考虑简单一点的,如果我们要使得 \([a,(n-1)a]\) (公差为 \(1\) )全部在根到节点的路径上出现一次,怎么搞?
就考虑将权值分配到每一个子树中,利用边来调整权值,这样就可以递归求值了。
再来考虑如何使得这个上界继续向上提,发现实际上就是需要利用到多个孩子两两之间的贡献。
如果考虑两组,其中一组为 \([1,size_a-1]\) (公差为 \(1\) ),另一组为 \([size_a,size_a\times (size_b-1)]\) (公差为 \(size_a\) ),那么这两组结合之后就可以产生 \([1,size_a\times size_b-1]\) (公差为 \(1\) ),也就是说如果将 \(size_a\times size_b-1\ge \lfloor \frac{2n^2}{9}\rfloor\) ,实际上我们就完成了题目的要求了。
这里我们必然考虑重心,我们需要满足的要求就是使得两个组的差不超过 \(\frac{n}{3}\) ,这里我们实际上可以直接考虑从大到小塞入每一个重心的子树,谁小分配给哪一个,这样应该可以使得两者的差最小。
CF1056E Check Transcription
卧槽,什么弔题?
首先,我们考虑暴力一点的做法,我们可以枚举第一个数字所对应字符串的长度,然后暴力 \(\text{check}\) 是否正确。这个复杂度应该是 \(O(|s||t|)\) 的,必然过不了。
但是你仔细揣度一下,如果我们枚举出现次数多的那个数字所对应的串的长度,长度上界实际上只需要枚举到 \(\frac{2|s|}{|t|}\) ,再结合每一次 \(\text{check}\) 是 \(O(|t|)\) 的话,复杂度就是 \(O(|s|)\) 的。
P2605 [ZJOI2010]基站选址
首先这个数据范围非常之奇怪,感觉大概推断不出来什么东西。xza
首先我们来一个暴力一点的 \(\text{dp}\) ,考虑 \(f[i][j][k]\) 表示到第 \(i\) 个村庄,上一个基站设在第 \(j\) 个村庄,同时已经设了 \(k\) 个基站的方案数。
这样的话每加入一个村庄就只有两种选择,放基站或不放,贡献直接计算即可。
考虑到这样必然是过不了的,我们考虑优化。
发现你用线段树将第二维优化掉就行了,好像有点细节,但是问题不太大。
CF321E Ciel and Gondolas
四边形不等式优化是满足决策单调性的。
考虑这里是属于他转移,从 \(k-1\) 到 \(k\) 的他转移,应该是可以使用分治算法的。
好像还可以 \(\text{wqs}\) 二分。
P7317 [COCI2018-2019#3] Praktični
一个常见套路就是建出一个生成树,然后对于所有环,必然可以通过若干仅有一条非树边的环异或得到,所以我们使得所有仅有一条非树边的环异或和为 \(0\) 即可。
又由于我们的单次操作是可以选择很多个位置的,所以我们只需要判断若干不同的数的最优方案是什么(即可以去重),然后可知利用线性基构造是最优的方案。
CF1495F Squares
首先,如果我们考虑将两种转移变成边,那么我们就会得到一个 \(\text{DAG}\) 。相当于是问我们走过钦定的若干个点之后走到唯一的出度为 \(0\) 的点的最小代价。
发现我们一定是按照顺序从左往右走的,也就是说答案实际上就是相邻两个点之间的最小代价求和。
我们能否一开始就将所有需要求的相邻点对找出来,然后离线查询之后再统计答案?感觉是可行的。对于离线询问,我们就考虑维护前缀每一个点到这个点的最短距离。考虑两种转移对于答案的贡献。应该不太可行。
感觉我们可以用 \(\text{LCT}\) 维护最短路树,然后查询最短路即可。(膜拜涛神)
没救了,题解应该是唯一做法。
尝试自己搞一下。
哇,是非常神奇的构造,你考虑建出一棵树,这棵树的边的定义和题目的第二种边正好相反,每一个点找到其前面的第一个大于其的点。
我们认为一个点走 \(i\rightarrow i+1\) 的边,就认为 \(i\) 被选择了。可以发现,如果一个点被选择了,那么其所有的在刚才那棵树上的祖先就一定是被选择的,原因非常显然,我们找到深度最浅的没有被选择的点,由于其上面的点都被选择了,那么其必然是会被走到了,所以如果没有走第一类边的话就走了另一种边,那么就一定会跨越 \(i\) 这个点(结合定义可知)。
那么显然的,如果我们必须要经过一个点,那么其祖先节点就一定需要被选。于是权值的计算就十分显然了。
如果我们令 \(c_u=-b_u+a_u+\sum_{v\in Son_u}b_v\) ,那么易得:
然后我们要使得 \(\text{res}\) 的值最小,发现这个东西和我们之前求的一个最小连通块的权值和十分相似。实际上两者是可以转化的。
我们令 \(dp_u\) 表示以 \(u\) 为根的子树与 \(u\) 相连的向下的最小连通块是什么。
那这个东西好像很好转移,
我们用刚刚的 \(\text{trick}\) ,令 \(d_u=-\min(dp_u,0)+c_u+\sum_{v\in Son_u}\min(dp_v,0)=\max(dp_u,0)\) 。
然后就行了。
以后 6666 字为一篇,超过就新开,完结撒花!

浙公网安备 33010602011771号