题解:AT_agc015_e [AGC015E] Mr.Aoki Incubator

原题链接:link。

自然想到建立坐标系,以速度为纵轴,初始点为横轴。

以样例二为例来分析:

考虑将点两两连线:

`

其中红线为斜率为负数的线,容易知道点 \((x_i,v_i)\) 与点 \((x_j,v_j)\) 所连成的线的斜率为 \(\frac{x_j-x_i}{v_j-v_i}\),注意到他们相遇的时间与斜率互为相反数,即若斜率为负数,则相遇的时间为正数,也就是两人会相遇。

接下来,我们将点编号:

这里我们先考虑 \(B,C,D\) 三个点,注意到 \(CD\) 的斜率比 \(BD\) 的斜率小,即 \(D\) 先于 \(C\) 相遇,后与 \(B\) 相遇。

翻译一下就是如果一开始 \(C\) 就被感染,那么 \(C\) 先与 \(D\) 相遇,那么 \(D\) 也被感染,接着 \(D\) 与 \(B\) 相遇,三人都被感染。

那么问题就出现了,我们如何处理这种间接感染的问题。

首先总结出规律,如果一个点 \(n\) 想要感染点 \(m\) 那么,点 \(n\) 与点 \(m\) 之间需要有一条斜率都是负的且单调上升的路径。

考虑关注一个点 \(k\) 的影响范围,容易想到点 \(k\) 的影响范围为 \(\left\{(x,y)\mid y\ge l,y\le r\right\}\) 其中 \(l\) 为最小的使与 \(k\) 连线的斜率小于 \(0\) 的点的纵坐标,类似的,\(r\) 为最大的使与 \(k\) 连线的斜率小于 \(0\) 的点的纵坐标,我们拿上图中的 \(D\) 点举例:

如图,蓝色区域就是点 \(D\) 的影响范围。

然后我们不考虑单个的点,我们考虑这个点的影响范围 \(l_i,r_i\) 现在,问题转换为求线段覆盖区间的方案数,使用 dp。

设 \(dp_i\) 为覆盖前 \(i\) 个点的方案数,有状态转移方程:

\dp_{k}=\\sum_{i=l_k}\^{k}dp_i \\

自然想到使用前缀和优化,使用树状数组,复杂度 \(\mathcal{O}(n\log n)\)。

相关推荐
ting_zh5 天前
通过 AUX 通道调试 DP Link Traning
dp·aux
longlongzihan15 天前
LeetCode 1004.最大连续1的个数III 滑动窗口及动态规划题解
c++·算法·leetcode·dp·滑动窗口
惆怅客12318 天前
UVa11640 Mayor Election
dp·fft·icpc·uva·生成函数的乘法
语戚1 个月前
力扣 1621. 大小为K的不重叠线段的数目:动态规划(Java 实现)
java·算法·leetcode·动态规划·力扣·dp
Tisfy1 个月前
LeetCode 1477.找两个和为目标值且不重叠的子数组:滑动窗口 + 记录前值(动态规划)
动态规划·题解·dp·滑动窗口
Tisfy1 个月前
LeetCode 2472.不重叠回文子字符串的最大数目:动态规划(贪心)
动态规划·字符串·题解·贪心·dp·回文字符串
a187927218311 个月前
【算法】动态规划第四篇:背包收官——min 哨兵、计数世界与组合排列分水岭
算法·leetcode·动态规划·dp·01背包·算法讲解·决策合并
a187927218311 个月前
【算法】动态规划第三篇:背包第一课——贪心之死与正序倒序开关
算法·leetcode·动态规划·贪心·dp·暴力·算法讲解
a187927218311 个月前
【算法】动态规划第五篇:区间 DP——从“看什么都像背包“到“最后戳谁“
算法·leetcode·动态规划·dp·区间·区间dp·算法讲解
a187927218311 个月前
【算法】动态规划第二篇:双序列 DP 三课——继承、计步与断链
算法·leetcode·动态规划·dp·回溯·暴力·算法讲解