【学习笔记】CF1322
智商不够,要回炉重造了
没猜出来结论,是不是该退役了
既然没做出来,那么还是要写一下题解。记与右部点 i i i相邻的点的集合为 S i S_i Si,如果 S i = S j S_i=S_j Si=Sj那么合并成一组,其权值为 c i + c j c_i+c_j ci+cj。最后答案是不同组的 c i c_i ci的 gcd \text{gcd} gcd。
这条结论的证明显然是不那么显然的,不过作为
oier
\text{oier}
oier要求的能力应该是把它给猜出来。但是当你自己做这道题的时候又怎会有信仰相信这里有一条结论呢?
证明也不难。当然我自己没有独立去想 。先把每个节点除以
gcd
\text{gcd}
gcd,然后相当于证对于任意
k
>
1
k>1
k>1,存在一个
S
S
S满足
f
(
S
)
f(S)
f(S)不被
K
K
K整除。如果
∑
c
i
\sum c_i
∑ci不被
K
K
K整除那么显然得证,否则取出度数最小的点
i
i
i,考虑将与其相邻的点从
S
S
S中删去,那么只有
i
i
i从
N
(
S
)
N(S)
N(S)中被删去了,如果
c
i
c_i
ci不被
K
K
K整除那么显然又得证了,否则就不断重复这个过程,直到有一个点不被
K
K
K整除为止。显然此时至少还剩
1
1
1个点,因此最后剩下来的
S
S
S不为空。
非常标准的
d
p
dp
dp题,所以教我如何快速切掉它。
先不考虑时间复杂度,应该如何计算贡献?
显然每个位置的贡献与跨过这个位置的点的数目有关,因此只要记录一下当前剩余点的数目就能算。因此我们将 l i l_i li从小到大进行处理,也就是倒序 d p dp dp。
然而,我犯了一个 非常致命的错误 :我把进位的过程想错了。究其本质,是读题的问题,我没有将死掉的那个选手给删除掉。
事实上这道题目非常简单。有一个非常技巧性的做法:设
d
p
i
,
j
dp_{i,j}
dpi,j表示当前级别为
i
i
i的人还剩
j
j
j个时的最大收益。考虑
d
p
i
,
j
dp_{i,j}
dpi,j能被转移到所满足的条件,显然就直接做到
O
(
n
2
log
n
)
O(n^2\log n)
O(n2logn)了,可以直接通过本题。真的吗。
不过这玩意可以用神必的方式优化到
O
(
n
2
)
O(n^2)
O(n2)。观察题解代码应该不难理解。
面对*3300的数据结构题,我只能望而兴叹
第一步都想错了。。。
考虑只有 0 / 1 0/1 0/1的情况,答案就是最长的 01 01 01段长度除以 2 2 2。
对于这道题,任取一个 Mid \text{Mid} Mid,将 ≤ Mid \le\text{Mid} ≤Mid的位置看成 0 0 0, > Mid >\text{Mid} >Mid的位置看成 1 1 1,只要取遍所有的 Mid \text{Mid} Mid,求答案的最大值就是第一问的答案。
对于第二问,考虑
Mid
\text{Mid}
Mid从小到大取遍时,第一次出现
0
0
0就是这个位置所对应的权值。好像有更聪明的方法,但是我不清楚
接下来的一步比较运气。考虑其差分序列,有一些比较好的性质,比如一段连续的 1 1 1就代表了一段 01 01 01交错的区间,所以第一问的答案就是连续段 1 1 1长度的最大值 / 2 /2 /2;对于 0 0 0相当于是不动点,因此我们用 set \text{set} set维护这些不动点的位置,然后区间覆盖即可。
复杂度 O ( n log n ) O(n\log n) O(nlogn)。
还是想的有点久,希望下次能更快一点
常数大的离谱,而且调的也有点久,考场上估计时间就不够了吧。
算是比较友好的一道题
首先对于每个点,设 a i a_i ai为 0 0 0表示 c i < c f a i c_i<c_{fa_i} ci<cfai, a i a_i ai为 1 1 1表示 c i > c f a i c_i>c_{fa_i} ci>cfai,如果已知 { a i } \{a_i\} {ai},那么再二分答案 Mid \text{Mid} Mid,显然我们可以树 d p dp dp判断是否合法。
显然 { a i } , { c i } \{a_i\},\{c_i\} {ai},{ci}需要同时考虑并转移,这也是这道题麻烦的地方。
我们发现对于
{
a
i
}
\{a_i\}
{ai}有两种限制:
1.1
1.1
1.1
a
i
=
a
f
a
i
a_i=a_{fa_i}
ai=afai
1.2
1.2
1.2 对于两个兄弟
i
,
j
i,j
i,j,
a
i
≠
a
j
a_i\ne a_j
ai=aj(这是
L
C
A
LCA
LCA处的限制)
那么我们定义, d p i dp_i dpi表示当 a i a_i ai为 0 0 0时的 c i c_i ci的最小值,显然将整颗子树的 { a i } \{a_i\} {ai}取反就能得到 a i a_i ai为 1 1 1时 c i c_i ci的最大值为 Mid − d p i + 1 \text{Mid}-dp_i+1 Mid−dpi+1。因此,知道了儿子的 { a i } \{a_i\} {ai}就能推出 d p i dp_i dpi。
观察上述限制,由于我们固定了 a i = 0 a_i=0 ai=0,因此对于第一类限制可以直接解决了。对于第二类限制,我们可以进行一个分组。对于没有固定的组,可以让其中一组全为 0 0 0,而另一组全为 1 1 1,那么我们观察,所有 [ x + 1 , Mid − y ] ∪ [ y + 1 , Mid − x ] [x+1,\text{Mid}-y]\cup [y+1,\text{Mid}-x] [x+1,Mid−y]∪[y+1,Mid−x]的交当中最小的那个点就是我们的答案。因为这两个区间是对称的,所以可以做到线性转移。
复杂度 O ( n log n ) O(n\log n) O(nlogn)。
唉,不知不觉这道题就写了半天,我真是太菜了
代码非常丑,不过好歹还是补完了
很难评价这道题,因为码量确实有点大,考场上无论如何都打不出来吧
其实我也在想,遇到这样复杂一点的问题,以我的码力真的能够完成吗?
常数大的离谱。
__EOF__

本文链接:https://www.cnblogs.com/cqbzly/p/17530010.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」