文章目录
- 总论
- [AcWing\293. 开车旅行](https://www.acwing.com/problem/content/295/)
- part1 确定`ga[], gb[]`
- part2 确定`f[]`
- part3 确定`da[]`和`db[]`
- [AcWing\294. 计算重复](https://www.acwing.com/problem/content/description/296/)
前方高能!!!
总论
可以使用倍增的情况是这一种情况可以任意划分。
AcWing\293. 开车旅行
输入样例:
输出样例:
这一道题目真的是难中难!!!
注意题目中所说的“且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为 。”.注意这些城市并不是排列在同一条线上,可能是1号到3号的距离更近。但是总体上的趋势是往东走。
现在思考,对于每一个点,都会向东走,走到距离最小或者是最小的地方。
由于:
- 各个城市的海拔高度互不相同
- 当前城市到两个城市的距离相同,则认为离海拔低的那个城市更近
所以每一个点(无论是A开车还是B开车)到达的下一个点的位置是固定的。SO?如果确定了起始点,那么所走的路线是唯一固定的。
part1 确定ga[], gb[]
由于最大值与最小值是在目前所处的点的东方,所以遍历的时候从右向左。遍历完一个就加上值。
使用set来求邻值。
对set的使用方法进行分析:
邻值肯定在与当前值最近的地方。如果最近的是2,那么次近的就是1或者3. 反之,如果最近的是3,那么次近的是2或者4.
所以只需要关注离他最近的这是个值。
为了方便,可以在set中存入两个正无穷以及两个负无穷!
注意:由于set不能含有相同的元素,所以两个“正无穷”不能相等
注意:0x3f3f3f3f不一定可以代表正无穷!他的值是1,061,109,567,大概是,当可能存在的最大值大于时,应该选择其他最大值,甚至是选择long long
。
part2 确定f[]
对于f[]
的确定,代码不是太难,重点是要学会使用倍增求出。
f[i][j][k]
表示从j
出发,k
先开车,走过所到达的位置。
k == 0表示小A开车
- 显然
f[0][j][0] = ga[j]
,f[0][j][1] = gb[j]
- 当
j==1
,有**(注意:与3不同的原因是的一半不再是偶数,初始开车的人不同)**
f[1][j][0] = f[0][ f[0][j][0] ][1]
(先小A开一下,然后小B在小A开到的位置继续开。
f[1][j][1] = f[0][ f[0][j][1] ][0]
- 当
j > 1
,有
f[i][j][0] = f[i-1][ f[i-1][j][0] ][0]
f[i][j][1] = f[i-1][ f[i-1][j][1] ][1]
f 的第一维的确定:由于使用倍增。而所以17已经够使用。
part3 确定da[]
和db[]
同样需要找到转移关系。
da[i][j][k]
表示从j
出发,k
先开车,走过,小A所走过的所有距离。
db[i][j][k]
表示从j
出发,k
先开车,走过,小B所走过的所有距离。
与上面相同,分为以下三种情况:
-
da[0][j][0] = dist(j, f[0][j][0]), db[0][j][0] = 0
db[0][j][1] = dist(j, f[0][j][1]), da[0][j][1] = 0
- 当
i == 1
有:
da[1][j][k] = da[0][j][k] + da[0][ f[0][j][k] ][1-k]
db[1][j][k] = db[0][j][k] + db[0][ f[0][j][k] ][1-k]
- 当
i > 1
,有:
da[i][j][k] = da[i-1][j][k] + da[i-1][ f[i-1][j][k] ][k]
db[i][j][k] = db[i-1][j][k] + db[i-1][ f[i-1][j][k] ][k]
AcWing\294. 计算重复
输入样例:
输出样例:
这一道题目简单概括就是求一个最大的m,使得字符串s2
被复制m*n2
之后是字符串s1*n1
的子序列。
更进一步进行简化:可以认为求一个最大的t,使得s2复制t次后是s1复制n1次的子序列。
.
这是因为满足单调性:当复制t次是子序列,那么当小于t次,显然也是子序列。
当复制t+1次已经不是子序列,那么大于t+1时,同样不再是子序列。(因为有多余的在s1*n1无法找到)
在这里,首先认为s1*INF是无限多的。由于具有周期性,可以使用0—size-1的位置表示。
f[i][j]
.指从第i个位置开始,得到个重复的s2的子序列所需要的最短的长度。
值得一提的是要注意有无解的情况