Description
城市中有一条长度为n的道路,每隔1的长度有一个公交车站,编号从0到n,学校在0号车站的位置。其中每个公交车站(除了n号车站)有两个属性ci和vi,代表从这个公交车站出发的公交车的性质。ci代表这个从i出发的公交车,相邻两个停靠站之间的距离。vi表示每坐1站的花费。
注意,一辆公交车出发后会向n号车站的方向行进。同时,一名乘客只能从起点站上车,但可以从任意停靠站下车。校庆志愿者小Z为了帮助校友查询有关城市交通费用的问题,想知道从0号车站(也就是学校)出发,到达每个公交车站的最小花费,于是他找到了你。
Solution
这题暴力十分的好打,但是当你以为可以斜率优化的时候,就会发现有些问题,因为他是一个凸包a+bx样的。
其实你可以观察一下关系,首先肯定要把c[i]和i%c[i]来用10*10的分类,这些都是可以相互转移的,然后当后面有一个v比前面的小,那么我前面的值明显就可以不用要了(这里直接从转移上考虑不是很好,如果在实际当中,你一定会下车换更小的票,也可以发现他的转移不一定要连续,肯定是去过程中v较小的来搞),因为函数的b就是v,所以现在就可以斜率优化了。
我们每次要加进来的这条线,和栈中的倒数第二条的交点,如果在和与最后一条线交点的左边,那么最后一条完全可以被代替掉没用了。
其实这题维护凸包,也可以插入很多条直线到线段树里面去,带个log,常数打的好就行了。
Code