AtCoder Grand Contest 041
1|0Preface
花了两个晚自习加上一个中午和一个周末晚上和大量的自习课时间打完了
ABE还勉强算自己想的都是陈指导想的,C看了点提示在同学的帮助下Rush出来了,D只能自己想出暴力,F想了两天连状态都不知道怎么设看了题解直呼内行
总结:水平太次,建议回炉重造
2|0A - Table Tennis Training
签到题,注意到如果两个人之间的位置差是偶数的话直接走就好了
否则就是两种情况:
- 在最左边或最右边相遇(先到的人可以一直等后面的人到)
- 在左边的人到了最左边之后等待一轮,然后在向右走与右边的人碰头;右边的人同理
讨论一下取最小值即可,WA了一发没看见要开long long
3|0B - Voting Judges
简单分析题。首先我们发现给从大到小排序后前个数是一定合法的(废话)
然后考虑从开始枚举最小的能被加到前的位置,贪心地想我们肯定只要加到第个地方即可
考虑这个位置每次都被加,那么剩下的次怎么分配?
显然对于所有位置在它之后以及前个数都可以随便加,那么我们给这些数也加满
那么问题来了,如果操作次数还有多怎么办,只能填在之间了
考虑判断不合法时怎么操作,我们求出,然后判断与剩下来的增加次数的关系
为什么可以这么做呢,因为中的数都,那么每个数都是可以经过次操作超过的,那么极限情况就是全加到
时间复杂度,因为要排序。然后有一个坑点,要判断,刚开始石乐志没判WA了两发
4|0C - Domino Quality
手玩构造题。这种题目看完就想着先手玩小的看看规律
然后和陈指导Rush了快1hour然后只搞出了的情况,感觉没什么规律
瞄了一眼题解,原来是偶数可以构造,回班之后开始尝试,竟然很快就Rush出来了(自习课加智商),以为例(一看就知道怎么构造的说):
同时也容易想到时可以直接用的拼出来,那么现在就考虑的奇数,考虑因为我们偶数的构造法行列都是三个,然后时的答案:
也是行列三个,容易想到我们先把左上角填一个的,然后在右下角填一个的
然后大功告成?发现当的时候就GG了,那怎么办?
手玩构造的答案(感谢无私奉献的同桌):
然后终于做完了,WA了一发在拼图的时候把偶数的最后一块填到第一行去了。。。
5|0D - Problem Scores
Rush了C之后看了看DE题面就滚回班了,连着想了两天然后只出了一个(然后被陈指导指点了一下复杂度发现是的)
首先我们考虑直接令增序,然后记,那么题中的条件等价于:
显然由于的对称性,我们只要做一半即可,换句话说只要前满足条件即可
然后我们考虑给展开然后移个项,就有
然后我们观察这个式子,当时,,说明左边的值单调不增
同时根据题设,也是单调不增的,因此容易发现我们可以把两维都压到状态里
设表示前个数,,的方案数,然后转移的时候枚举上一次的差值,容易得到转移:
直接维护两个数组记录上面两个项的后缀和然后减一减即可,注意下边界
然后我们发现是奇数的时候中间的数要特别考虑,还要在枚举转移方式讨论一下(实现详见代码)
然后这个暴力DP状态转移,因此复杂度
当然如果你想伟大的陈指导一样压一下上界的话,复杂度是的
暴力的代码:
然后这样的DP肯定就是考虑如何去掉其中的一维,而我和陈指导一直都以为要去掉和的那一维,然后笋干爆炸
考虑进一步转化问题,我们设,特殊地
然后现在问题变成了,求(结合前面DP的转移系数看一下就能发现只是把问题变了个形式)
考虑我们还是依次枚举,由于,我们可以把所有的都减去(因为不影响差值),即
容易发现现在的和之前定义的取值范围相同了,也就是说他可以看做原问题的子问题,我们可以用一个状态一起表示
所以设表示前个,时,然后我们只需要枚举当前的即可转移
但是虽然DP好写了但是还是的啊,不过对于这个DP我们很容易优化(据说是常见技巧)
考虑相当于在中选出一个点(姑且叫做关键点)的方案数
然后我们可以不用枚举当前的的值,加一维表示当前是否选择了关键点,然后就可以把许多状态同时按序转移了
具体详见代码,复杂度
6|0E - Balancing Network
E题小清新乱搞题,感觉比D简单多了
首先考虑,容易想到如果我们枚举最后走到的电线
假设每条电线都有机会走到,考虑可以从后往前处理每条路径构造答案
如果路径两端都能到或者都到不了显然就可以随便放,否则让路径从不能到的指向能到的即可
那么怎么判断每条电线能否被其他电线走到呢,很简单直接把路径先当成双向的然后bitset
搞一波即可
这部分就轻松做完了,复杂度
然后考虑,我们还是一样的从后往前处理路径,记录一个表示电线最后走到的电线是哪条
显然如果我们把路径定向成那么
由于要让最后所有的不全相同,那么我们尽量每次让出现次数多的变成出现次数少的,不难证明这样是可以满足要求了
然后特殊情况是,此时无论如何都会走到一起,特判即可,一发入魂
7|0F - Histogram Rooks
想的时候完全没有思路的说,ORZcz_xuyixuan聚聚
这类计数DP最难的地方就在于状态的设计,如何设计一盒好的状态不重不漏同时复杂度够低
考虑对于每一列的状态,有以下三种可能:
- 这一列有车
- 这一列没车,但是每行都被其他列的车控制了
- 这一列没车,而且存在没有被控制的行
然后考虑关键的一点,假设我们当前只考虑这一列的上面的一些行,那么如果下面的那些行中每行都被控制了,那么(2)类列可以被视为(1)类列;否则(2)类列被视为(3)类列
那么我们在状态中可以把某些列的上面行压入状态,同时加上一维表示在下面的行中是否存在没有车的行,然后把(3)类列的个数记录进去即可
转移的话由于需要逐行转移,由于这里的图高度参差不齐,因此每次可以移除最下面的一行或者断开已经空了的列处理子图
乍一看状态很多,实际上由于只会被断开次,状态数仍然是级别的,转移的话讨论放这一列或者不放即可,代码中注释比较详尽
用记忆化搜索实现即可,转移的时候类似树上背包是不会影响最终的复杂度的
8|0Postscript
一周做一场AGC再写个题解就差不多的说,其他题目都没什么时间去写了233
__EOF__

本文链接:https://www.cnblogs.com/cjjsb/p/12902274.html
关于博主:复活的ACM新生,目前爱好仅剩Gal/HBR/雀魂/单机/OSU
版权声明:转载请注明出处
声援博主:欢迎加QQ:2649020702来DD我
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2018-05-16 Luogu P3390 【模板】矩阵快速幂&&P1939 【模板】矩阵加速(数列)