AGC 补题笔记

[AGC001]#

A.BBQ Easy#

由于最大数肯定要和一个比自己小的数搭配保留该数,不如选择保留次大数,如此递归即解。因此将序列排序后输出序号为奇数的数即可。

B.Mysterious Light#

观察样例,考虑重复因素,即将路径长度分割成若干个个等边三角形周长总和,可以注意到每次折射的过程实际上是将大的数减去小的数的过程,直到相减为 0,这个过程就是辗转相减法。

于是会发现每条三角形长度都是计算 nx 最大公因数中辗转相减法中的一项,但是最后自己减自己那部分没有被算到答案里,即可得到答案为 3ngcd(n,x)

C.Shorten Diameter#

题目数据范围很小,考虑直接枚举根节点判断,则所有节点离该节点的距离都不超过 k2,若 k 是偶数直接枚举计算,否则可以改为枚举边,因为两点间对应边只有一条,所以这时相当于有两个根,枚举即可。

D.Arrays and Palindrome#

把样例画出来试一试,发现在人工判断的过程中,我们相当于给图中具有等价关系的两点连边,即一个回文串中相等的点连边,然后构造出的解必须满足点构成的图联通。

由此我们可以考虑无解的情况,即图不连通,此时分为两种情况,要么边不够 n1 条,要么图较为特殊。但本题中如果只判断 ab 单个数组所构成的回文串,边数也不超过 n2,而出现奇回文块的情况更是会减少边数,因此我们可以得到如果 a 中奇回文块的个数多于 2,那么一定无解。

那其他情况呢?继续手推样例,发现无解的情况大多出现在我们使某两个回文块回文中心相同,于是我们可以考虑错排,b 中第一个连通块为 a 中第一个连通块大小加 1,最后一个为 a 中最后一块减 1,其他不变,可以发现这种构造方法是正确的。

为了保证少出现奇连通块,我们还需要把 a 中奇连通块放到头尾,即可正确构造。

E.BBQ Hard#

题目让我们求一个二项式系数之和,暴力时间复杂度为 O(N2),我们考虑能不能把 ij 两部分拆开分别计算后再进行合并。

考虑组合意义,从一堆里面选出若干个可以等价于将堆分成两堆,这两堆选出的物品个数之和为要求的个数的方案数,我们枚举其中一堆选出的物品个数,原式可以化为 injnk(ai+biaik)(aj+bjaj+k),把求和次序交换,外层枚举 k 内层相当于两个多项式相乘,但是这里预处理的时间复杂度不会超标,直接计算可以做到 O(nk)

还有没有其他做法呢?这看起来就很像个卷积,但是单项计算复杂度就是 O(n) 的,我们只好换个思路,考察二项式系数原本的定义,转化柿子为 [xai+aj]injn(x+1)ai+aj+bi+bj,这下可以卷了,除掉 x 后将两边分开可以变成 [x0](k2nQk(1+x)k)2,其中 Qi 为所有 ai+bikxai 之和。

由于一个数列每次乘 (1+x) 都是加一遍自己和自己移位之后的数列,我们这里只记录每一项的系数,预处理 Qk(1+x)k,倒序循环枚举 ik 到 0,把对应 ai 位置加 1 后整体乘上 (1+x),即每个位置向后移一位后加一遍原本的序列即可,这也等价于自己前面每个数加一遍自己前面的系数,这个倒序枚举每次乘 x(此处为(1+x)) 的做法也叫作秦九韶算法。最后别忘记去重,我们不能使 i=j

还有没有其他做法呢?考虑原式的组合意义,即从 (0,0) 走到 (ai+bi,aj+bj) 的方案数,考虑分离两部分,我们平移坐标轴,把起点设为 (aiaj),之后考虑多个起点的 dp 进行统计即可,这种方法也不要忘记去重。

作者:eastcloud

出处:https://www.cnblogs.com/eastcloud/p/17421820.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   eastcloud  阅读(94)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示