【hrbust2294】修建傳送門

題意

哈理工2016級新生程序設計全國邀請賽B題
n個點1~n,i到i+1的距離爲a[i],如今能夠在兩個點之間建一個傳送門,則兩點之間距離爲0,求建傳送門後1號出發的最遠距離最小是多少?php

題解

a[i]的前綴和爲s[i]。
假設在A、B兩點創建傳送門後,兩點距離爲dis[i][j]。ide

對於B固定的狀況,最遠距離要麼是s[n-1]-s[B],要麼是dis[1][k]裏的最大值,k爲A、B兩點之間的點, dis[1][k]=min(s[k],s[A]+(s[B]-s[k]))。s[A]顯然越小越好。因此就讓A在第一個點的位置。因而dis[1][k]=min(s[k],s[B]-s[k])。spa

假設最大的dis[1][k]的 k 爲 C。
知足$$s[j]<s[B]-s[j]且s[j+1]\ge s[B]-s[j+1]$$的 j 或者 j+1 就是 C(其實就是AB中間位置兩邊的點)。
這裏的C是隨着B遞增不會減少的,所以不用O(\(n^2\)),只要每次維護 j 知足不等式便可。設計

代碼

#include<cstdio>
#include<algorithm>
using namespace std;
int n;
long long s[100005];//注意要開long long
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        for(int i=1;i<n;i++){
            long long a;
            scanf("%lld",&a);
            s[i]=s[i-1]+a;
        }
        int j=1;
        long long ans=s[n-1];
        for(int i=2;i<n;i++){
            while(j<i&&s[j+1]<s[i]-s[j+1])j++;
            ans=min(ans,max(max(s[j],s[i]-s[j+1]),s[n-1]-s[i]));
        }
        printf("%lld\n",ans);
    }
    return 0;
}
┆涼┆暖┆降┆等┆幸┆我┆我┆裏┆將┆ ┆可┆有┆謙┆戮┆那┆ ┆大┆始┆ ┆然┆ ┆薄┆一┆臨┆你┆的┆還┆沒┆ ┆來┆ ┆是┆來┆遜┆沒┆些┆ ┆雁┆終┆ ┆而┆ ┆ ┆暖┆ ┆如┆地┆站┆有┆ ┆也┆ ┆我┆ ┆的┆有┆精┆ ┆也┆沒┆ ┆你┆ ┆ ┆這┆ ┆試┆方┆在┆逃┆ ┆會┆ ┆在┆ ┆清┆來┆準┆ ┆沒┆有┆ ┆沒┆ ┆ ┆生┆ ┆探┆ ┆最┆避┆ ┆在┆ ┆這┆ ┆晨┆ ┆的┆ ┆有┆來┆ ┆有┆ ┆ ┆之┆ ┆般┆ ┆不┆ ┆ ┆這┆ ┆裏┆ ┆沒┆ ┆殺┆ ┆來┆ ┆ ┆來┆
相關文章
相關標籤/搜索