【1046 20 前缀和】 Shortest Distance

传送门

题意

给定 \(n\),然后给出长度为 \(n\)\(d\)\(d_{i}\) 表示 \(i\)\(i+1\) 之间的距离,给定 \(m\) 个询问每次包含 \(l,r\) ,问这两个点之间的最短距离

数据范围

\(3\leq n\leq 10^{5}\)
\(m\leq 10^{4}\)

题解

  • 求出前缀和,以及所有的和
  • 规定 \(r>l\) 后,答案为 \(min(d[r-1]-d[l-1],sum-(d[r-1]-d[l-1]))\)

Code

#include<bits/stdc++.h>
using namespace std;

int main(){
	int n; cin>>n;
	int sum=0;
	vector<int>d(n+1);
	for(int i=1;i<=n;i++){
		int x; cin>>x;
		sum+=x;
		d[i]=sum;
	}
	int m; cin>>m;
	for(int i=0;i<m;i++){
		int l,r; cin>>l>>r;
		if(l>r) swap(l,r);
		int res=d[r-1]-d[l-1];
		res=min(res,sum-res);
		cout<<res<<endl;
	}
}
posted @ 2021-02-23 14:13  Hyx'  阅读(52)  评论(0编辑  收藏  举报