Alice's Print Service


Time Limit: 2 Seconds      Memory Limit: 65536 KB

Alice is providing print service, while the pricing doesn't seem to be reasonable, so people using her print service found some tricks to save money.

For example, the price when printing less than 100 pages is 20 cents per page, but when printing not less than 100 pages, you just need to pay only 10 cents per page. It's easy to figure out that if you want to print 99 pages, the best choice is to print an extra blank page so that the money you need to pay is 100 × 10 cents instead of 99 × 20 cents.

Now given the description of pricing strategy and some queries, your task is to figure out the best ways to complete those queries in order to save money.

Input

The first line contains an integer T (≈ 10) which is the number of test cases. Then T cases follow.

Each case contains 3 lines. The first line contains two integers n, m (0 < n, m ≤ 105). The second line contains 2n integers s1, p1, s2, p2, ..., sn, pn (0=s1 < s2 < ... < sn ≤ 109, 109 ≥ p1 ≥ p2 ≥ ... ≥ pn ≥ 0). The price when printing no less than si but less than si+1 pages is pi cents per page (for i=1..n-1). The price when printing no less than sn pages is pn cents per page. The third line containing m integers q1 .. qm (0 ≤ qi ≤ 109) are the queries.

Output

For each query qi, you should output the minimum amount of money (in cents) to pay if you want to print qi pages, one output in one line.

Sample Input

1
2 3
0 20 100 10
0 99 100

Sample Output

0
1000
1000
 #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
typedef long long LL; LL a[],b[];
LL f[]; void prepare(LL n)
{
LL Min=b[n]*a[n];
LL ans;
f[n]=Min;
for(LL i=n-;i>=;i--)
{
ans=a[i]*b[i];
if(Min>ans)
Min=ans;
f[i]=Min;
}
}
LL EF(LL x,LL l,LL r)
{
LL mid=(l+r)/;
while(l<r)
{
if(a[mid]>x)
r=mid-;
else if(a[mid]<x)
l=mid;
else if(a[mid]==x)
return mid;
mid=(l+r+)/;
}
return mid;
} int main()
{
LL T;
LL i,n,m,x,k;
scanf("%lld",&T);
while(T--)
{
scanf("%lld%lld",&n,&m);
for(i=;i<=n;i++)
{
scanf("%lld%lld",&a[i],&b[i]);
}
prepare(n);
while(m--)
{
scanf("%lld",&x);
k=EF(x,,n);
LL ans=x*b[k];
if(k+<=n && ans>f[k+]) ans=f[k+];
printf("%lld\n",ans);
}
}
return ;
}

最新文章

  1. Windows phone 8.1布局控件
  2. Linux压缩指令
  3. 第一个WP8程序,照相机
  4. javascript最新深度克隆对象方法
  5. [原博客] POJ 1740 A New Stone Game
  6. css3 2D变换 transform
  7. Hadoop集群出现no data node to stop的解决方案
  8. Multi-Objective Data Placement for Multi-Cloud Socially Aware Services---INFOCOM 2014
  9. [iOS Animation]-CALayer 图像IO
  10. 简单的视频采集demo
  11. 完美解决cannot resolve symbol servlet 的报错
  12. java既然存在gc线程,为什么还存在内存泄漏?
  13. htop的安装和使用
  14. jvm结构
  15. log4j 输出原始数据到指定日志文件
  16. SpringMVC 学习 九 SSM环境搭建 (二) Spring配置文件的编写
  17. 后台取IE的相关信息
  18. 理解Storm Metrics
  19. mariadb(mysql)从库relaylog损坏无法同步的处理方法
  20. dbms_random 包的使用

热门文章

  1. JavaScript DOM编程艺术 笔记(二)语句操作
  2. NSInvocation 调用block clang代码转换c++
  3. lua小试牛刀
  4. Jenkins Slave Nodes – using the Swarm Plugin
  5. appium桌面版和命令行版的安装
  6. tomcat在bin下的startup.bat下启动报错
  7. dynamics crm 365 附件上传图片并且显示。
  8. grep练习
  9. CentOS7 firewalld打开关闭防火墙 开放端口
  10. sql count中加条件