JZOJ 5415. 【NOIP2017提高A组集训10.22】公交运输
Description
城市中有一条长度为n的道路,每隔1的长度有一个公交车站,编号从0到n,学校在0号车站的位置。其中每个公交车站(除了n号车站)有两个属性ci和vi,代表从这个公交车站出发的公交车的性质。ci代表这个从i出发的公交车,相邻两个停靠站之间的距离。vi表示每坐1站的花费。
注意,一辆公交车出发后会向n号车站的方向行进。同时,一名乘客只能从起点站上车,但可以从任意停靠站下车。校庆志愿者小Z为了帮助校友查询有关城市交通费用的问题,想知道从0号车站(也就是学校)出发,到达每个公交车站的最小花费,于是他找到了你。
Input
输入的第一行有两个整数,n和maxc。
之后的n行,每行两个整数,分别表示0到n-1号车站的c和v.
Output
输出一行n个整数,其中第i个整数代表从0号车站到i号车站的最小花费,若不能从0号车站到达i号车站,则在i号车站的位置输出-1。
Sample Input
输入1:
1 1
1 1
输入2:
9 5
2 5
5 2
5 14
1 18
4 13
3 17
1 16
1 7
5 4
Sample Output
输出1:
1
输出2:
-1 5 -1 10 -1 15 19 20 33
Data Constraint
对于30%的数据满足,1<=n<=5000
对于60%的数据满足,1<=n<=10^5
对于另20%的数据满足,maxc=1
对于100%的数据满足,1<=n<=10^6,1<=maxc<=10,1<=ci<=maxc,1<=vi<=1000
数据存在梯度。
Hint
样例1说明:从0号车站坐1站地,到达1号车站,花费为1,可以发现这是从0号车站到1号车站的最小花费。
Solution
设 F[i]F[i] 表示第 ii 个点的最优答案,那么显然可以想到:
F[i]=min{F[j]+i−jc[j]∗v[j]}F[i]=min\{F[j]+\frac{i-j}{c[j]}*v[j]\}
但是这样DP的时间复杂度是 O(N2)O(N^2) ,显然不能AC。
看到后面的一串表达式像斜率的形式,但是由于转移距离 c[j]c[j] 的限制不能直接斜率优化。
于是我们想到分类讨论:按照 cc 的值和 i mod ci\ mod\ c 的值维护 maxc∗maxcmaxc*maxc 一个上凸包,
用单调栈存储即可。时间复杂度为 O(N)O(N) 。
Code
#include<cstdio>
#include<vector>
using namespace std;
const int N=1e6+1,inf=1e9;
vector<int>s[11][10];
int f[N],c[N],v[N];
inline int read()
{int X=0,w=1; char ch=0;while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();return X*w;
}
inline void write(int x)
{if(x<0) putchar('-'),x=-x;if(x>9) write(x/10);putchar(x%10+'0');
}
inline int min(int x,int y)
{return x<y?x:y;
}
inline double get(int x,int y)
{if(v[x]==v[y]) return inf;return (double)(f[x]-f[y]-v[x]*(x/c[x])+v[y]*(y/c[y]))/(v[y]-v[x]);
}
inline int calc(int x,int y)
{return f[y]+(x-y)/c[y]*v[y];
}
int main()
{int n=read(),mc=read();for(int i=1;i<=n;i++) c[i-1]=read(),v[i-1]=read(),f[i]=inf;for(int i=0;i<n;i++){int x=c[i],y=i%c[i];while(!s[x][y].empty() && v[i]<=v[s[x][y][s[x][y].size()-1]]) s[x][y].pop_back();while(s[x][y].size()>1 &&get(i,s[x][y][s[x][y].size()-1])>=get(s[x][y][s[x][y].size()-2],s[x][y][s[x][y].size()-1])) s[x][y].pop_back();s[x][y].push_back(i);for(int j=1;j<=mc;j++){y=(i+1)%j;while(s[j][y].size()>1 &&calc(i+1,s[j][y][s[j][y].size()-1])>=calc(i+1,s[j][y][s[j][y].size()-2])) s[j][y].pop_back();if(!s[j][y].empty()) f[i+1]=min(f[i+1],calc(i+1,s[j][y][s[j][y].size()-1]));}}for(int i=1;i<=n;i++) write(f[i]==inf?-1:f[i]),putchar(' ');return 0;
}
JZOJ 5415. 【NOIP2017提高A组集训10.22】公交运输相关推荐
- JZOJ 5414. 【NOIP2017提高A组集训10.22】幸运值
Description 校庆志愿者小Z在休息时间和同学们玩卡牌游戏.一共有n张卡牌,每张卡牌上有一个数Ai,每次可以从中选出k张卡牌.一种选取方案的幸运值为这k张卡牌上数的异或和.小Z想知道所有选取方 ...
- 【JZOJ 5410】【NOIP2017提高A组集训10.22】小型耀斑
Description Uthuso 的核反应失控了,她在地灵殿释放了几颗大核弹.地灵殿可以看做一个大小为n*m 的矩阵.一颗大小为k 的核弹,对于任意一个与爆炸中心曼哈顿距离小于k 的地区,会造成( ...
- JZOJ 5410. 【NOIP2017提高A组集训10.22】小型耀斑
Description Uthuso 的核反应失控了,她在地灵殿释放了几颗大核弹.地灵殿可以看做一个大小为n*m 的矩阵.一颗大小为k 的核弹,对于任意一个与爆炸中心曼哈顿距离小于k 的地区,会造成( ...
- jzoj5410【NOIP2017提高A组集训10.22】小型耀斑
题目 Description Uthuso 的核反应失控了,她在地灵殿释放了几颗大核弹.地灵殿可以看做一个大小为n*m 的矩阵.一颗大小为k 的核弹,对于任意一个与爆炸中心曼哈顿距离小于k 的地区,会 ...
- JZOJ5411. 【NOIP2017提高A组集训10.22】友谊 DP
DescriptionFlowey 是一朵能够通过友谊颗粒传播LOVE 的小花.它的友谊颗粒分为两种, 圆粒的和皱粒的,它们依次排列组成了一个长度为2m 的序列.对于一个友谊颗 粒的序列,如果存在1& ...
- 【JZOJ5410】【NOIP2017提高A组集训10.22】小型耀斑
Description Uthuso 的核反应失控了,她在地灵殿释放了几颗大核弹.地灵殿可以看做一个大小为n*m 的矩阵.一颗大小为k 的核弹,对于任意一个与爆炸中心曼哈顿距离小于k 的地区,会造成( ...
- 【JZOJ5411】【NOIP2017提高A组集训10.22】友谊
Description Flowey 是一朵能够通过友谊颗粒传播LOVE 的小花.它的友谊颗粒分为两种, 圆粒的和皱粒的,它们依次排列组成了一个长度为2m 的序列.对于一个友谊颗 粒的序列,如果存在1 ...
- [JZOJ5410]【NOIP2017提高A组集训10.22】小型耀斑 (口胡)
Description Uthuso 的核反应失控了,她在地灵殿释放了几颗大核弹.地灵殿可以看做一个大小为n*m 的矩阵.一颗大小为k 的核弹,对于任意一个与爆炸中心曼哈顿距离小于k 的地区,会造成( ...
- 【NOIP2017提高A组集训10.22】友谊
Description Flowey 是一朵能够通过友谊颗粒传播LOVE 的小花.它的友谊颗粒分为两种, 圆粒的和皱粒的,它们依次排列组成了一个长度为2m 的序列.对于一个友谊颗 粒的序列,如果存在1 ...
最新文章
- QT中在Designer中设置QToolButoon上面图标下面文字
- python urllib3离线安装_全球Python库下载前10名
- 线上服务器内存分析及问题排查
- 远程桌面服务器office版本,在启用远程桌面服务的计算机上部署 Office 2010
- zebra探秘(一)
- linux 禁用超线程,Linux动态启用/禁用超线程技术
- 关于累加偶数奇数的c语言程序,c语言 在1-100之间,求所有奇数和偶数的个数和所有奇数和偶数的和(写到一个里面)...
- Kunbernetes从私有仓库nexus拉取镜像
- 苹果电脑安装windows双系统
- C语言转义字符'\'
- 给的再多,不如懂我——Gif录制工具,这两个就够了
- linux中i的英文单词,Linux下gcc/g++中-I(i的大写)、-L和-l
- 微信扫码登录功能实现
- This inspection performs unresolved SQL references check.
- openshift学习手册
- 什么是HTTP/2?HTTP/2和HTTP/1.1区别是什么?
- 如何理解 ssh 三大框架
- 【产品设计】原型设计
- 计算机软考 教材 基本,计算机软考教材
- mh采样算法推导_基于MH抽样算法的贝叶斯Probit分位回归模型研究