zr2021神选摸底赛杂题
简述题意:平面上 n 个点,每个点都是一个加油站,每个点都有一个 c_i,希望从一号点开车到二号点,油箱上线为 w,你可以在途中进行至多 d 次加油,注意初始时你没有油,所以出发时一定会加一次油,路途中每走 k 个单位的距离就会消耗 k 单位的油,距离为曼哈顿距离,加 k 单位的油需要花费 c_i\times k,球最小花费
数据范围:d\leq 10, n\leq 1000, w\leq 100000
部分分三档:n\leq 10;n,w\leq 100;n\leq 100
前两档部分分可以通过设 dp 状态 f[d][i][j] 表示当前在 i 号点加第 d 次油,加完后还剩 j 单位油解决
考虑满分做法
首先可以发现,如果从一个大点 i 走到一个小点 j,那么需要保证离开大点时油箱一定是正好有 dis(i,j) 单位油,那如果从一个小点走到一个大点呢
一定要加上 w 单位的油
这好像看起来不太正确啊,但可以用三角不等式证明
假设我们的路途是这样:小点 i 走到大点 j 然后走到一个极小点 k,如果 w 单位的油在到达 k 点时还没消耗完,就是反例了
但是 w 单位的从 i 点加的油一定会在 [j, k] 这个路途中的某一个位置耗尽,因为,如果没有耗尽,那么以为着这油一定能支撑车从 i 走到 k,那么为什么要途经 j 呢?所以问题回到大点走到小点的 case
那么这题就稍微明朗一些了
我们可以把第三维状态缩小一定的范围,因为现在我们发现,我们实际有用的状态数量就是 n 级别的
设 f[d][i][j] 表示当前第 d 次加油,在 i 点,走的时候油箱里有 dis(i,j) 单位的油,特别地,j=n+1 表示留了 w 单位的油
考虑转移(这里为了方便书写,第三维意义还是油箱剩余容量)
大点 j 走小点 i:
需要油箱里有着正好 dis(i,j) 单位的油,所以 f[d-1][j][dis(j,i)]\rightarrow f[d][i][0],我们离开 i 点的时候肯定不能只有 0 的油量,所以还需要向上合并,这个问题先留着,后面再说
小点 j 走大点 i:
需要油箱加满,所以 f[d-1][j][w]\rightarrow f[d][i][w-dis(j,i)],那么问题来了,w-dis(j,i) 这个大小我们没有记啊
一种解决办法是直接再开 n 个状态,表示 w-dis
另一种办法是:直接二分到比他大的第一个状态位置,设这个位置大小为 C,合并到那里,同时加上 (C-(w-dis[j][i]))\times c_i 大小
为什么正确呢?因为上面的那个三角不等式证明,所以从 i 点到后面一个点的距离,一定大于 (C-(w-dis[j][i]))
但是这个二分带一个 log,O(dn^2\log n) 复杂度肯定是接受不能的
解决办法很容易,二分这个过程对于整个做法而言是独立的,直接预处理就行了,复杂度 O(dn^2+n^2\log n)
那么我们就只剩一个问题了,如何向上合并
如果每次转移之后都直接向上转移到顶你就收获了一个 n^3 级别的做法
对于这个问题有个很小的 trick,我们先不合并,先放在转移到的位置上,把当前这个点全部 dp 完了之后,再从最底部直接统一合并到顶
总复杂度:O(n^2(d+\log n))
没代码
简述题意:给定两个序列分别长 n 和 m,m序列初始全为0,n序列给定,n_i\leq m,支持三种操作,分别是:1.查询m序列(输出整个序列);2.n序列上区间赋值;3.将n序列上 [l,r] 区间内的每个 n_i,作为下标,对应到 m 序列上,把对应到的位置加上 x
数据范围:查询次数可以看作一次,其他数据全部小于100000
solution1:
正难则反,考虑将操作序列全部倒置来做,对于一次区间加操作,我们可以直接种一颗大小为 n 的线段树,直接区间加
对于区间覆盖操作,我们可以把覆盖的区间求和然后清零,然后将求和的值直接加到覆盖的值对应的位置上
查询操作直接查查就好
O(n\log n)
solution2:
上面的做法其实不是很好想,考虑比较常规的做法
一种套路地做法,我们可以把颜色相同的一段连续子序列看成一个点
那么对于覆盖操作,我们可以直接把区间涉及到的小子序列合并成一个颜色,即一个点,当然,两头可能会有多余的位置,再开两个点就好
这个操作总共复杂度是 O(n) 级别的,因为在不断合并连续的子序列,每次最多新产生三个子序列
可以用 set 记录所有子序列的左端点来维护
考虑区间加操作,直接种棵线段树就好了,和上面做法差不多
O(n\log n) 但常数较大且不是很好写
优化:对于区间加操作,我们也把他操作地序列裂开,能方便好写非常多
暂无代码
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
【推荐】2025 HarmonyOS 鸿蒙创新赛正式启动,百万大奖等你挑战
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】开源 Linux 服务器运维管理面板 1Panel V2 版本正式发布
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步