1046 Shortest Distance(20 分)

The task is really simple: given N exits on a highway which forms a simple cycle, you are supposed to tell the shortest distance between any pair of exits.

Input Specification:

Each input file contains one test case. For each case, the first line contains an integer N (in [3,10​5​​]), followed by N integer distances D​1​​ D​2​​ ⋯ D​N​​, where D​i​​ is the distance between the i-th and the (i+1)-st exits, and D​N​​ is between the N-th and the 1st exits. All the numbers in a line are separated by a space. The second line gives a positive integer M (≤10​4​​), with M lines follow, each contains a pair of exit numbers, provided that the exits are numbered from 1 to N. It is guaranteed that the total round trip distance is no more than 10​7​​.

Output Specification:

For each test case, print your results in M lines, each contains the shortest distance between the corresponding given pair of exits.

Sample Input:

5 1 2 4 14 9
3
1 3
2 5
4 1

Sample Output:

3
10
7
 #include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <map>
#include <stack>
#include <vector>
#include <queue>
#include <set>
#define LL long long
using namespace std;
const int MAX = 4e5 + ; int N, D[MAX], pre[MAX], M, ans, a, b, ans2;
struct node
{
int L, R, val;
}P[MAX]; void build(int dep, int l, int r)
{
P[dep].L = l, P[dep].R = r, P[dep].val = ;
if (l == r)
{
pre[l] = dep;
return;
}
int mid = (l + r) >> ;
build(dep << , l, mid);
build((dep << ) + , mid + , r);
} void update(int r, int b)
{
P[r].val += b;
if (r == ) return ;
update(r >> , b);
} void query(int dep, int l, int r)
{
if (P[dep].L == l && P[dep].R == r)
{
ans += P[dep].val;
return ;
}
int mid = (P[dep].L + P[dep].R) >> ;
if (r <= mid) query(dep << , l, r);
else if (l > mid) query((dep << ) + , l, r);
else
{
query(dep << , l, mid);
query((dep << ) + , mid + , r);
}
} int main()
{
// freopen("Date1.txt", "r", stdin);
scanf("%d", &N);
build(, , N);
for (int i = ; i <= N; ++ i)
{
scanf("%d", &D[i]);
update(pre[i], D[i]);
} scanf("%d", &M);
while (M --)
{
ans = ;
scanf("%d%d", &a, &b);
if (b < a) swap(a, b);
if (a == b - ) ans += D[a];
else query(, a, b - );
ans2 = ans, ans = ; if (a - == ) ans += D[];
else if (a - > ) query(, , a - );
if (b == N) ans += D[N];
else query(, b, N);
printf("%d\n", min(ans, ans2));
}
return ;
}

最新文章

  1. Python中两种处理错误方法的比较
  2. No Javascript on this page
  3. word-wrap、white-space和word break的区别
  4. wex5 教程 之 图文讲解 bind-css和bind-sytle的异同
  5. android: startActivityForResult用法详解
  6. Unity 3D 中实现对物体 位置(position) 旋转(rotation) 大小(scale) 的全面控制
  7. Flexbox——快速布局神器
  8. SpinLock 实现
  9. C/C++数组名与指针的区别详解
  10. UUID Gen
  11. 跨平台移动框架iMAG开发入门
  12. Xamarin.Android
  13. C# PDF Page操作——设置页面切换按钮
  14. 4.12Python数据处理篇之Matplotlib系列(十二)---绘图风格的介绍
  15. Java单例模式《二》懒汉式
  16. sql产生随机时间
  17. c++ vector详解
  18. new JSONObject(str)无法解析 报错:org.json.JSONException: Value of type java.lang.String cannot be converted to JSONObject
  19. js form 表单 重置 清空
  20. kibana5画图

热门文章

  1. Potato土豆win综合提权
  2. std::multimap
  3. Linux与Git学习笔记
  4. MongoDB-系统时钟跳变引发的风波
  5. 微信小程序中的canvas基础应用
  6. 史上最详细的IDEA优雅整合Maven+SSM框架(详细思路+附带源码)
  7. 如何把当前时间戳转化为时间格式HH:MM:SS
  8. 【原创】怎样才能写出优雅的 Java 代码?这篇文章告诉你答案!
  9. 让你的sql开启氮气加速
  10. SpringBoot自定义starter及自动配置