疯狂的重心
话说做过幻想乡战略游戏的人应该很容易切掉这道题目吧
我们考虑一棵树如果添加了一个叶子,那么其重心最多向叶子方向移动1的距离
而是否移动我们只需要记录子树中有多少个点就可以判断啦
也就是说这个叶子对于时间复杂度的贡献是1
那么我们考虑每次在x-y上添加一条边,等于将x所在的树和y所在的树合并
这一步我们可以采用启发式合并,每次把小的向大的里插
这样暴力合并的时间复杂度是O(nlogn)
也就等价于我们最多插入单个节点O(nlogn)
那么对于重心的计算显然也是O(nlogn)的
那么现在的瓶颈就是如何动态的维护子树中有多少个节点
对于这一步我们可以采用LCT维护,每次暴力合并之后链修改即可
在合并之后再暴力移动重心就可以辣,细节比较多也比较烦
不过主体都是暴力QAQ
疯狂的机器人
做了做BC上周的题目,有个裸的默慈金数
可以直接O(n)递推得到,做完之后一直想着能不能用FFT搞一搞
然后就把题目变了个形,但是并不知道有没有大神有O(n)递推的神做法
首先我们考虑操作中哪些操作走,设走的操作有i个
再考虑走的操作中哪些是向上走,设向上走的操作有j个
我们很容易发现当只能向右和向左走时,这个题实际上是合法进出栈序列,也就是卡特兰数
只能向上和向下走的时候也同理
很容易得到ans=sigma(C(n,i) *sigma( C(i,j) * f(j) * f(i-j)))
其中f(i)我们定义为当i为奇数时,f(i)=0
当i为偶数时,f(i)=catalan(i/2)
令g(i)=sigma(C(i,j) *f(j) *f(i-j))
不难发现这是个卷积形式,直接NTT即可
之后ans=sigma(C(n,i) *g(i) )
我们这一步直接枚举i计算其实就可以了
不过实际上这还是个卷积形式,依然可以NTT