比赛地址:2024寒假训练赛2
A 递增序列
对于任意一个元素严格递增的序列,都是符合条件的。
所以直接输出 就行了。
A题代码
B 牛币发放
对于牛币数量,如果不是 的倍数,就一直减 ,直到变成倍数为止。
B题代码
C 张灯结彩
首先考虑 ,当 无穷大时,灯笼串的摆放应该为
这样必然保证 每个长度为 的连续区间内的灯笼数量必须两两不同 ,因为每段长为 的连续子序列都是一个 的排列。
所以我们可以统计出可以布置多少段 ,每段消耗的灯笼数量为 k*(k+1)/2
。
然后取余,得到最后一段的灯笼数量。
显然最后一段是等差数列,首项为 ,公差也为 。
其前 项和是递增的,具有二分性。
所以我们二分去找,最多还能构造到哪个右边界。
也就是找最大的 ,使得剩余灯笼能布置一段 。
C题代码
D 数值叠加
构造一个差分数组 ,每次操作令 b[l] 加上 ,令 b[r+1] 减去 。
代表这个操作影响,从 开始,到 结束。
最后做一遍前缀和,相当于把所有的影响模拟一遍。
如果 a[i]+b[i] 为奇数,就输出其下标 。
D题代码
E 卡片赠送
首先,要维护 个人的卡片账号,就要开 个 。
然后,对于卡片赠送这个行为,我们需要使用启发式合并算法,每次都是 账号中卡片数量少的 转移到 账号中卡片数量多的。
如果 是少的那一方,我们需要对双方的 进行一次交换。否则不需要。
可以证明,通过非 方式,转移的卡片数量不会超过 次。
解决完交易问题,我们来思考如何维护输出。
可以使用 来动态维护 卡片数量 与 员工编号。
对于每一个 , 位置存放卡片数量, 位置存放员工编号。
考虑到 的排序是先按 后按 ,当 相同的时候,最大的 的 也是最大的,不符合我们的要求(员工编号最小)。
可以使用一些小技巧,让员工编号变为负数,然后作为 。
这样,原来最小的编号,反而最大了。
在输出时只需要把负号乘回去,负负得正。
E题代码
F 二十一点
这里给出一份详细的游戏规则:21点
计算每个人的点数时,先把所有的 都当作 来算。
算完之后,如果至少有一张 ,且当前点数小于等于 ,那么能且仅能把其中一张 当成 点。
反证法:如果把两张 变成 ,那么已经至少 点了,21点不允许这种类型的自爆。
F题代码
——————————————————
感谢同学们的积极参与!