[NOIP2012]开车旅行

Luogu1081

LOJ2604

李煜东代码

预处理出\(ga[i] , gb[i]\)代表从城市\(i\)出发\(A\)\(B\)走一步会到达的城市
\(f[i][j][k]\)表示从城市\(j\)出发 , 两人共驾驶\(2^i\)天 , \(k\)先开车 , 最终会到达的城市
\(da[i][j][k]\)表示从城市\(j\)出发 , 两人共驾驶\(2^i\)天 , \(k\)先开车 , 小\(A\)的行驶路程总长度
\(db[i][j][k]\)表示从城市\(j\)出发 , 两人共驾驶\(2^i\)天 , \(k\)先开车 , 小\(B\)的行驶路程总长度

注意转移是有\(f[1][j][k]\)的情况 , 此时由于天数\(2^0\)是奇数 , 前后开车的人不一样 ; \(i>1\)以后开车的人就一样了.
\(calc(s,x)\)表示计算从\(s\)城市出发最多走\(x\)公里A和B分别行驶了多长路程.
这三个状态都可以做到\(O(n\log n)\)预处理 , 只有一个\(1\)询问 , 就直接对每一个点都求一次求最小值 ; 对于\(2\)询问就直接\(alc(s,x)\)

基础的母题可能是这个 : HKE与他的小朋友 , 题解是这样说的 , 我的解释

每个状态都有一个对应的后继状态 , 这样的题可以用倍增处理 .
一开始觉得这道题非常不可做 , 因为它的转移一定是要枚举的 , 学到后面才发现很多东西都可以预处理出来 , \(DP\)也就是这个道理
\(DP\)对状态的最优化就是倍增了 .

转载于:https://www.cnblogs.com/lizehon/p/10630405.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值