我是靠谱客的博主 自信马里奥,最近开发中收集的这篇文章主要介绍【HihoCoder - 1880】地铁环线 (前缀和,水题,模拟),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题干:

H市有一环线地铁,一共包含N站,编号1~N。正向行驶的地铁会按1 -> 2 -> 3 -> ... -> N -> 1的方向行驶,反向会按1 -> N -> N-1 -> ... -> 3 -> 2 -> 1的方向行驶。  

给定所有相邻两站之间地铁行驶的时间(正向、反向时间相同),假设小Hi要从第X站到第Y站,请你判断是小Hi是乘坐正向还是反向的列车用时更少?

Input

第一行包含两个整数N和M,分别代表地铁站数目和询问的次数。

第二行包含N个整数A1, A2, ... AN,其中Ai代表从第i站正向行驶到下一站所用的时间。  

以下M行每行包含两个整数X和Y,代表一个询问。

1 ≤ N, M ≤ 100000  1 ≤ X, Y ≤ N  1 ≤ Ai ≤ 100000

Output

对于每组询问,输出一个整数表示最短时间。

Sample Input

5 2
1 2 3 4 5  
1 3  
1 5

Sample Output

3  
5

 

解题报告:

   相当于一个循环队列就可以了、、、

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
#define fi first
#define se second
using namespace std;
const int MAX = 2e5 + 5;
ll a[MAX];
ll sum[MAX];
int main()
{
	int n,m;
	cin>>n>>m;
	for(int i = 1; i<=n; i++) scanf("%lld",a+i),sum[i] = sum[i-1] + a[i]; 
	
	while(m--) {
		int l,r;
		scanf("%d%d",&l,&r);
		if(r < l) swap(l,r);
		ll tmp1 = sum[r-1] - sum[l-1];
		ll tmp2 = sum[n] - sum[r-1] + sum[l-1];
		printf("%lldn",min(tmp1,tmp2));
	}
	
	
	return 0 ;
 }

 

最后

以上就是自信马里奥为你收集整理的【HihoCoder - 1880】地铁环线 (前缀和,水题,模拟)的全部内容,希望文章能够帮你解决【HihoCoder - 1880】地铁环线 (前缀和,水题,模拟)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部