题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5163
问题描述
Bestland有一条非常长的马路,马路上设有 n 个公交汽车站。公交汽车站从左到右标号为1到 n 。有 m 个人想要乘公交。你的任务是找出每个人到终点为止所需要的时间。注意:你需要用来解决这道题目的信息在Input里面,请仔细阅读。输入描述
输入的第一行包含一个整数 T (1≤T≤60) ,表示测试数据的组数。对于每组测试数据:第一行包含两个整数 n 和 m (2≤n,m≤105) ,表示公交车站的数目和乘客的数目。 接下来一行包含 n−1 个整数, d1,d2,…,dn−1 ( 1≤di≤109 ). di 表示第 i 个公交站和第 i+1 个公交站之间的距离。在接下来的 m 行, 每行包含两个整数 xi 和 yi ( 1≤xi,yi≤n,xi≠yi ), 表示第 i 个人时刻0的时候在第 xi 个公交站并且想要到第 yi 个公交站去。 (1≤i≤m) 对于第 i 个人, 公交车在第 ((i−1) mod n)+1 个公交站点在时刻0的时候,并且公交一开始往右开。公交到达站点 n 的时候会立刻转向往左开,同样当公交到达站点1的时候也会立刻转向往右开。你可以认为公交每秒只开一个单位距离,你只需要考虑公交开的时间。输出描述
对于每个人,输出到达
yi
个公交站点需要的最少时间。
输入样例
1 7 3 2 3 4 3 4 5 1 7 4 5 5 4输出样例
21 10 28 提示: 对于第一个人, 公交在站点1出发, 然后这个人在时刻0上车。21秒之后,公交到达站点7。 对于第二个人,公交在站点2出发。7秒之后,公交到达站点4,这个人上车。之后又过了3秒,公交到达站点5.总共用了10秒。 对于第三个人,公交在站点3出发。7秒之后,公交到达站点5,这个人上车。之后过了9秒,公交达到站点7,然后转向开往站点0。之后经过12秒,公交达到站点4。因此总共需要28秒时间。代码:
#include<iostream>
#include<cstdio>
using namespace std;
__int64 tt[100005];
__int64 sum[100005];
int main()
{
int t;
scanf("%d",&t);
int n,m;
int x,y;
while(t--)
{
scanf("%d %d",&n,&m);
tt[1]=tt[0]=0;
for(int i=2;i<=n;i++)
{
scanf("%I64d",&tt[i]);
tt[i]=tt[i-1]+tt[i];
}
for(int i=1;i<=m;i++)
{
scanf("%d %d",&x,&y);
int now=(i-1)%n+1;
if(now<=x && x<y)
sum[i]=tt[y]-tt[now];
if(now>x && x<y)
sum[i]=2*tt[n]-tt[now]+tt[y];
if(y<x)
sum[i]=2*tt[n]-tt[now]-tt[y];
}
for(int i=1;i<=m;i++)
printf("%I64d\n",sum[i]);
}
return 0;
}