USACO铂金题解
USACO 铂金题解
USACO 2018 Platium
B. Sort It Out
很巧妙的转换
注意到操作并不会影响没有被选中的牛的相对顺序
所以没有被选中的一定单调递增
要使得选中的尽可能少,就要选尽可能长的没有被选中的序列,即原序列的
所以原题等价于求原序列第 大
用树状数组维护前缀最大值和最大值的方案数
C. The Cow Gathering
先考虑怎么找到一个合法的点,显然可以拓扑排序
建图 每次当一个点 就加入队列 最后剩下的一个点一定合法
回到原图,每个 的限制条件相当于一条 的边
发现,当以 下方的一个点为root时必然会存在环,即不合法
所以可以从一个合法的出发dfs, 所有 即其子树都不合法,其他合法
D. Lifeguards
明显可以先把被别的包含的区间去掉,这样一定更优
此时按区间左端点排序同时可以保证右端点递增
考虑dp, 表示到第 个区间,删除了 个区间,并且保证 没有被删除的最大覆盖长度
暴力可以 转移
考虑转移分为两种
- 前一个区间的右端点小于当前的左端点,可以直接维护一个max
- 否则发现转移的时候,可以考虑把式子拆开,此时要维护的是前缀 的max,这个明显可以单调队列维护
F. Sprinklers
令 表示第 行的喷头位置
首先,发现每一行必定连续一段合法,且
可以 求出每一列对应的上界记为
形式化转换原问题位以下式子
可以前缀和优化到
G. Out of Sorts
将排序的过程看做是 以后比 小的值向前移动至 之前的过程
实际上我们要考虑的就是这个会进行多少次
会发现每次排序,后面比 小的值总是前进一个
所以就是要求在 后面比 小的最远的数的位置
考虑答案怎么求,发现每相邻两个数对答案的贡献为两个数的 的 max
因为只有当两边都合法时,这个分隔才不会再被调用
I. Disruption
树剖裸题
USACO 2020 Platium
A. Non-Decreasing Subsequences
cdq分治
考虑怎么转移,
对于
对于
可以用树状数组维护前缀和 直接转移即可,转移完做一个前缀和,因为上面的式子转移的是正好为
询问就乘法原理,从前后分别选一个拼接,也可以前缀和优化
B. Falling Portals
考虑出发点的高度与终点的高度,贪心的来说,当终点在起点下方时,必然应该一直向下落速度更快的地方走,反之同理,下文只考虑第一种情况,另一种同理差不多
此时,以 轴为时间, 轴为高度,把图画出来,发现所有的传送都发生在交点上,且对于每一个询问,交点恰好是一个上凸包
单调队列维护这个上凸包以后,每次取斜率尽可能小的,在凸包上二分即可(因为答案必然为凸包上一点)
时间复杂度
感觉还是不太懂,挖坑待填
C. Delegation
显然要二分,考虑当前要check的长度是
对于每个点,用一个 multiset
维护所有的儿子向上的那条链的长度
每次去除最小的一条,选择最小的可以使这条链达到 的链与这条链拼接
最后每个点只能向上一条链(可以长度为0),直接判断即可
时间复杂度
D. Help Yourself
考虑 的情况,用线段树维护区间和,单点加,区间乘就行
考虑怎么计算 的情况,可以二项式拆开,每个节点都维护 下的答案
具体来说对于一个区间 , 有以下 种转移
- 将 转移到
- 将 转移到
- 将 都乘
E. Sprinklers 2: Return of the Alfalfa
手摸一下发现最后的分界线一定是一条从左上到右下的折线
考虑对这个折线dp
dp[i][j][0/1]
表示当前考虑到 0
表示当前的折线是向右的 1
即表示当前折线是向下的
对于 的转移同理
H. Sleeping Cows
把两个并在一起排序
dp[i][j][0/1]
表示考虑到第 项,剩下 头牛确定要住进棚子但是没有确定进哪一个,当前有没有跳过牛的方案数
转移分为两种,对于当前点为牛
对于当前点为牛棚
注意开 long long
会MLE
本文作者:xiaruize's Blog
本文链接:https://www.cnblogs.com/xiaruize/p/17788153.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步