3月日记
3.4
不能再摆了。
一个普通的字符串问题
考虑建图。
等价的条件是建出来的图相同。而一个字符串对应一种欧拉回路走法。
点集很小,考虑BEST定理。
大概就是一张有向图上以x开始的欧拉回路个数等于 $C \times deg_x \times \prod_{v\in V}deg_v $, C是以x为根的根向树个数。
具体的考虑对每个点除了在树上的出边钦定顺序,走的时候先按顺序走,再走回父亲的边。
对于已有的欧拉图走法同样可以构造。
然后直接算即可。
[ARC070F] HonestOrUnkind
厉害的。
注意到无解条件是 a <= b
考虑构造一个栈,形如 坏坏坏好好好好这种。
每次与top询问,如果是Yes则加入到后面,否则和top一起删除。
注意到删除时候必有一个坏,那么最后的栈一定有好的。
Phone Plans
双指针,维护将启发式合并撤销的过程即可。
3.5
Club of Young Aircraft Builders (hard version)
直接从前往后dp即可。
这种多测的题目不要直接swap或者memset 数组。
京都观光
感觉很牛。
考虑什么样的 \(a_i\) 是有用的。考虑从 \((a_{i - 1}, j)\) 到 \((a_{i + 1}, j + 1)\)的过程。
当 \(2a_i > a_{i - 1} + a_{i + 1}\) 时,\(a_i\)是没有用的。
那不止 \(j\) 到 \(j + 1\) 呢?注意到这个柿子和 \(j\) 没关系(将不等式加起来消掉了),\(j\) 比较大的时候仍然是可以推出来这个式子的。
就是 \(a_i\) 比较大的时候一定会绕开它的意思。
对于 \(a_{i - x}, a_{i + y}\) 仍然可以推出类似的结论。 可以发现就是凸包的形式。
因此 \(a_i\) 只有在凸包上才是有效的。\(b\) 同理。
直接在凸包上贪心。
3.6
查省选分。
像梦一样。
3.7
最后一日到来之前,不要放弃希望。
即使是……我也要继续下去。
意义可以等到这一切尘埃落定后来讨论。
3.9
学了好几天最小内向森林了。我要破防了。。。
不是我咋这菜。
哦我好像会了。我会了吗?我会了吧。
3.10
[JOISC 2023] Security Guard (Day4)
考虑树的情况下,不加边是什么答案。
对于安全度最小的点,显然所有边都得至少有这个数量的保安。
那就可以直接对答案加 当前边数 * 点权。
然后对于所有岛减去这个值。
这个岛就变成0了,原本通过这个岛连接的边可以被看成一条多度边。可以递归地做下去。
那直接考虑最终的答案,相当于是每次删掉 \(deg_i - 1\) 条边(最后一次是 \(dag_i\))
显然被一条删掉的边总共加的权值就是这个点的权值。
所以贡献是 \((\sum_{i = 1}^{n} S_i * (deg_i - 1) ) + \max_{i}^{n} S_i\)
对于不加边的图,那就是找一颗生成树出来。
而这个贡献显然是可以拆开成为一颗内向树,根节点是S最大的,\(u -> v\) 边权为 \(S_v\)
注意到这里根可以改为任意指定位置u,只要最终答案加上去 \(S_{max} - S_u\)
那如果加 \(k\) 条边进来,原本的应该是一个有 \(k + 1\) 棵树的森林。
考虑钦定最小点做根,那直接连 \(k\) 条指向最小点的边是很优的。
相当于最终答案就是有 \(k + 1\) 棵树的森林的最小权值和加 \(k * S_{min}\) 加 \(S_{max} - S_{min}\)
关于最小内向森林的求法,欸这咋说啊🤔
具体的推法好像是通过wqs加堆优化朱刘的双log,通过一些贪心和优化得到的?
但我好像没看懂。
所以有个比较,奇怪的理解方式。
就是维护目前所有的根结点向外扩展一条边的最小代价。一开始所有点都是根。
然后如果这条边指向外部,那就直接连。
如果指向自己的子树里,会形成环。对于环上的某个点,显然可以删去原本连向的父亲的边,加上新的边,成为根节点。
那这个点可以视为和根节点等价。只需要把所有连的边边权加(新的边权 - 原本连向的父亲的边权)即可。
用平衡树可以做单log。
(不过我写的是set启发式合并的双log,好写一点qwq)
Many Illumination Plans
感觉比较educational
就是,考虑暴力背包的话一次合并都很难做到。
但是他这个n很小,考虑能不能只加值,不做背包合并。
可以每次先把已有的dp数组递归进所有儿子,再把自己加进去。
相当于在已有的数组上加,然后加个重剖的话一次就是解决一条链。
值得注意的是,由于实现的是在原有基础上加点,所以在递归非重儿子的时候,要递归两次。
3.11
joisc2017 長距離バス
考察这个删除人的过程,可以发现每次删的是一个区间(即在之前操作已经被删除过的序列上是区间)。
而值得注意的是,对于一个固定的最终删除情况,每次必然是尽可能多的删除。
因此每次删的在原序列上也是区间。
那就是一个把序列分成若干区间的问题。显然是可以dp。
写出dp方程发现可以斜率优化。
无敌了,他题面翻译保证S递增结果不是。。。
坑我调了好久……
原来题面里保证递增数据范围里不写就是没有吗/ng
怎么这么坏啊怎么这么坏啊怎么这么坏啊怎么这么坏啊怎么这么坏啊
Graph Inclusion
唐了,我怎么没想出来。
注意到这种问题删边是很困难的,所以考虑线段树分治
3.12
树像圆锥,底大头小。
树像圆,可以通过画圆框出一个连通块。
3.13
写轻重边,从超级大常数双log(也可能是3log)改成了比较小常数双log
仍然拼尽全力无法战胜卡常。
我讨厌卡常。
拼尽全力终于战胜。
3.14
数据结构到底要怎么学啊/ll
好破防,简单的一眼秒,难的题解看不懂也写不出。
我是尸体哈哈哈。。。
喷火喷火喷火喷火。
算了老老实实写点简单的就当练代码能力了。
3.15
CF241B Friends
好像和题解做法都不太一样,当然我也没仔细看所有题解(
感觉我的做法跑的更快一些,但是题解做法,怎么说,更结构化(???),更好想一点(?)
就是在trie树上按位判断,如果这一位是1的个数小于等于m,加上答案并让这些点往0递归。
否则的话往1递归。
每一维度有很多两两相对的点,注意到如果有一个是0不会对答案有贡献。
所以访问的点数不会比trie树点数多。
哎感觉比较难描述这个做法。本质上,和题解应该差不多吧()但是把二分和统计贡献搞在一起做了。
复杂度仍然是O(nlog^2w)的,但是常数很小,所以跑得很快。
我好像知道自己最大的问题是什么了。
思路太混乱。
除非是特别简单的题,否则我自己都说不清楚怎么做出来的。
真就纯靠直觉呗……
但是现在开始改是不是疑似太晚了/ll
3.18
[JOISC 2020] 収穫
不是,我对着平衡树卡了一万年的常数然后发现自己找环复杂度是假的。。。
是基环森林。树的情况是好做的。
至于环的情况,考虑钦定一条边断环成链。不经过该边的点是树,可以简单处理。
经过的点,可以被当成在同一个点(指定的边出来的点)出发的。
而询问也可以被当成在这个点询问的,如此计算。
[NOI2019] 序列
很有意思啊,我的神秘贪心做法最后和模拟费用流搞出来的做法长得好像啊
(好吧也许也没有那么像)
其实是学不会模拟费用流怒而转想贪心结果搞出来的故事(
感觉很有意思啊,两边都在前k的话也不一定会被选。
考虑假如指定了 \(l\) 个是要两边都被选的。那可以直接从两边各找最大的 \(k - l\) 个加进答案。
那先放两边最大的 \(k - l\) 个进去,每次加两头都要被选中的进去,要加 \(l\) 次。
如果有和以前放的重合的,贡献就改为该边加目前还没放进去的最大的。
可以轻松做到 \(O(n^2)\) ,用 4个set分类讨论维护就是 \(O(n log n)\)
3.19
让乃龙来理解人类的语言还是太,为难乃龙了qwq
同理,让乃龙用人类的语言说话也是,太困难。
感谢OI,让我意识到我其实不是人,是乃龙。
哎,乃龙当年出生的时候天赋树点歪了,长期记忆力为 0。
我怎么学啥都记不住啊。
哎我怎么越写越唐啊qwq
[CTS2019] 随机立方体
推柿子真好玩。
考虑转为至少 \(k\) 个,哎这个 \(k\) 的范围纯诈骗吧。最后二项式反演一下就可以得到答案。
钦定 \(i\) 个位置为极大的,那么考虑按要填的值从小到大填这些位置,可以注意出来其余的点会被要求比某个这样的点小。
形如一个在内向树(具体的,内向毛毛虫?)上填数字,要求祖宗比后代大。
然后推一推柿子就做完啦。
主旋律
再战主旋律。
笑点解析:在联合省选2025的考场上,这个人忘了主旋律的做法,只记得这个题很简单(所以为什么有这么个印象啊!),而且还没想出来。
好像和上次的感受不太一样。
感觉这题……正确性并不是基于DAG的容斥。
考虑直接枚举缩点之后零度点(枚举集合和个数)(不要枚举为全集且只有一个的情况)
也就是说,容斥的并不是一个DAG,而是缩点之后所有的零度点。
3.20
我怎么这么唐啊。硬生生把大水题写成了大模拟😭。
不是,不是,不是,不是,啊。
3.21
我有把所有题目写成大模拟的超能力!
但是,我不会写大模拟啊。。。
是吗是吗是吗是吗不是不是不是不是。
写登山。
事实证明,不看题解效率并不会比看题解高。
当然可能是我太菜了。。。
虽然但是,这题当年没有卡常卡不过去的吗?
还是只有我是糖糖做法?
upd: loj 过了,洛谷死活过不去。
为什么过不去啊,为什么啊。。。
登山
纪念一下第一次做这个题胡出来的乃龙做法。(还会做第二次吗?也许吧……下次就不写这个做法了……又难写常数还大……)
实现的太菜了所以只能在loj上擦线通过……也可能是这个做法的确先天大常数吧……
注意到可以设个dp柿子按照冲刺来转移,那么系数是可以通过线段树合并求出来的。
如果持久化线段树合并的话,可以直接求出每个点的系数。
但是注意到,dp的值是只能从上往下求的,因此把这些值扔到每一位应该被它加的值上是比较困难的。
那就考虑撤销线段树合并的过程,把系数视为不下传的tag。
撤销某个区间的合并的过程中,有这样几种情况:
1.原本的两颗线段树都没有值 即是现在的为0 还原的时候返回两个0
2.只有一个有值 合并时记录下是哪个有值 返回即可
3.原本两个都有值 由于合并的时候自带的tag也是要合并的,所以要记录下tag,在这个时候复原。
但是这还没完,因为经过仔细的观察,可以发现前面的求系数要支持的操作其实是:区间加,合并,区间删点
也就是,因为h的限制,还得多做一个操作。
所以还得考虑如何撤销区间删点:
1.这个区间被要删除的区间包含 合并时记录下这个区间,并删去这颗子树。撤销的时候再接回来,而应该插进去的dp值可以直接暴力枚举加入,由于每个点最多被删除一次,复杂度不会大于点数。
2.无交集 不用管
3.有交集但不被包含 合并:可以注意到,如果这个地方原本有tag的话,那么这个tag含义本应该是这个区间加的,但是现在这个区间有一部分要被删掉,因此可以考虑在这个时候把tag下传到儿子。并记录下原本的tag 撤销的时候按照记录的东西还原即可。
然后就……做完了。
3.24
简单数据结构
注意到如果序列不降的话是可以简单用平衡树维护的。
那问题转化为找出每个点第一次被1操作影响的位置。
这个可以整体二分。
具体的,每次1操作可以被看成一个一次函数,需要判断其最小值是否小于等于\(a_i\)
可以用李超树维护。
3.26
[CEOI 2024] 加油站
没想清楚就写了,有点失败的。
考虑淀粉质,经过特定点的路径的贡献。
对于某个点,如果路径是从他的子树内(不包括自己)转移上来的,那么结尾在哪里并不重要,只要经过分治中心即可。
那么可以对于每个点二分,找到第一个走到其父亲必须至少加一次油的站。
如果不存在这样的站,就暂时不考虑。
特别的,设定分治中心没有这种贡献。
而如果路径是从外面过来的,注意到是否在某个点停下是基于其走向的儿子的。
所以\(dp_v\)表示在\(fa_v\)上停留的方案数。 而他可以从一段祖先链上转移过来。
也可以从分治中心转移过来,具体的,是不在同一个分类(分治中心的子树)的所有满足长度要求的路径数量和。

浙公网安备 33010602011771号