1864: railway(输出路径)

文件提交:无需freopen 内存限制:512 MB 时间限制:0.000 S
评测方式:普通裁判 命题人:
提交:0 解决:0

题目描述

NO2019开始了。czy必须从老家赶到hohai大学。因此他要乘坐火车。


方便起见,czy所经过的车站在一条直线上。最开始,他在直线最左端的站台上。




在清明假期,所有的收费都是分段式的。具体来讲,从i点到j点的距离为|a[i]-a[j]|,其中a表示某地的绝对位置。不妨设两地的距离为l。若:


0  < l <= l1,要花费c1元。


l1 < l <= l2,要花费c2元。


l2 < l <= l3,要花费c3元。


l > l3,无法到达。


因此,czy想要花最少的钱到达某一个车站。他希望你输出到达每一个车站的最小花费

输入

第一行6个整数,分别为l1,l2,l3,c1,c2,c3。---> 保证l与c递增 <---
接下来1行,为1个整数n,表示车站的个数。
接下来1行n个整数,第i个数是车站的绝对位置,保证数字递增。


输出

一行,共n个数字,第i个数字表示czy到达第i个车站最少的花费。特别地,若czy达不到第i个车站,输出-1。

样例输入

1 2 3 1 2 3
4
5 8 11 15

样例输出

0 3 6 -1

提示

czy从第一个车站到第二个车站,距离为8-5=3,因此付了3的费用。
czy再从第二个车站到第三个车站,距离为11-8=3,因此付了3的费用。
czy从第三个车站无法到达第四个车站,因此为-1。
【解题提示】
取尺法
n<=500,000,其余的数均在int范围内。
请使用long long。
为了防止读入与输出超时,这里给出了一份模板:
读入优化:
template<typename T>inline void read(T &cn)
{
   char c;int sig = 1;
   while(!isdigit(c = getchar()))if(c == '-')sig = -1;cn = c-48;
   while(isdigit(c = getchar()))cn = cn*10+c-48;cn*=sig;
}
例子:read(x);//等价于cin>>x或scanf("%lld",&x)
输出优化:
template<typename T>inline void write(T cn)
{
   if(!cn){putchar(48);putchar(' ');return;}
   if(cn<0){putchar('-');cn = 0-cn;}
   int wei = 0;T cm = 0;int cx = cn%10;cn/=10;
   while(cn)cm = cm*10+cn%10,wei++,cn/=10;
   while(wei--)putchar(cm%10+48),cm/=10;
   putchar(cx+48);
   putchar(' ');
}
例子:write(x);//等价于cout<<x<<" "或printf("%lld ",x),没有换行

来源/分类