A1046 Shortest Distance

自己的做法是每次查询时遍历数组来计算路径,但这样很容易会导致超时,可以在计算sum时顺便把1号节点到i+1号节点的顺时针路径保存,这样可以直接采用这些路径,无需每次都遍历。(i+1是因为i=n时,可以把n到1的顺时针路径保存下来。)dis[i](1<=i<=n)表示1号节点按顺时针方向到达i号节点顺时针方向的下一个结点的距离。

#include <cstdio>
#include <algorithm>
using namespace std;

const int MAXN=100005;
int dist[MAXN],A[MAXN];
int main(){
    int sum=0,query,n,left,right;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&A[i]);
        sum+=A[i];
        dist[i]=sum;
    }
    scanf("%d",&query);
    while(query--){
        scanf("%d%d",&left,&right);
        if(left>right)
            swap(left,right);
        int temp=dist[right-1]-dist[left-1];
        printf("%d\n",min(temp,sum-temp));
    }
    return 0;
}

 

posted on 2021-01-10 11:10  臭小孩  阅读(49)  评论(0)    收藏  举报

导航