【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;
}
}