제출 #20752

#제출 시각아이디문제언어결과실행 시간메모리
20752aintaShortcut (IOI16_shortcut)C++14
71 / 100
1423 ms2884 KiB
#include "shortcut.h"
#include<stdio.h>
#include<algorithm>
#define pll pair<long long, long long>
using namespace std;

int L[3010], C[3010], n, CCC;
long long Res, INF = 1e17, D[3010], P[3010], Deq[6010][2];

pll Do(int m){
    int i, head = 0, tail = 0;
    long long s = 0, ss;
    for(i=0;i<m;i++)s += D[i];
    ss = 0;
    head = 1, tail = 0;
    for(i=0;i<m;i++){
        if(i!=m-1){
            while(head <= tail && Deq[tail][1] >= ss-P[i])tail--;
            tail++;
            Deq[tail][0] = ss, Deq[tail][1] = ss-P[i];
        }
        ss += D[i];
    }
    long long MM = 0, MM2 = 0;
    for(i=0;i<m-1;i++){
        while(head <= tail && (ss - Deq[head][0])*2 > s)head++;
        if(head <= tail){
            MM = max(MM, ss + P[i] - Deq[head][1]);
        }
        while(head <= tail && Deq[tail][1] >= ss-P[i])tail--;
        tail++;
        Deq[tail][0] = ss, Deq[tail][1] = ss-P[i];
        ss += D[i];
    }
    ss = 0;
    for(i=0;i<m-1;i++){
        long long t = s - D[m-1] - ss;
        MM2 = max(MM2, min(t, s-t) + P[i] + P[m-1]);
        ss += D[i];
    }
    return pll(MM,MM2);
}

pll Get(int b, int e){
    long long MM = -1, s = 0, Mn = INF, rr = 0, rr2 = 0;
    int i;
    for(i=b;i>=0;i--){
        rr = max(rr,s+C[i]-Mn);
        MM = max(MM,s+C[i]);
        Mn = min(Mn,s-C[i]);
        if(i)s += L[i-1];
    }
    P[0]=MM;
    D[0]=L[b];
    for(i=b+1;i<e;i++){
        P[i-b] = C[i];
        D[i-b] = L[i];
    }
    MM = -1, s = 0, Mn = INF;
    for(i=e;i<n;i++){
        rr2 = max(rr2,s+C[i]-Mn);
        MM = max(MM,s+C[i]);
        Mn = min(Mn,s-C[i]);
        if(i!=n-1)s += L[i];
    }
    P[e-b] = MM;
    D[e-b] = CCC;
    pll tp = Do(e-b+1);
    rr2 = max(rr2, tp.second);
    rr = max(rr, tp.first);
    return pll(rr,rr2);
}

void Pro(int be){
    int i, B, E, mid, rr = be;
    B = be+1, E = n-1;
    pll tp;
    while(B<=E){
        mid = (B+E)>>1;
        tp = Get(be, mid);
        if(tp.first <= tp.second){
            rr = mid;
            B = mid+1;
        }
        else{
            E = mid-1;
        }
    }
    if(rr != be){
        tp = Get(be, rr);
        Res = min(Res, max(tp.first,tp.second));
    }
    if(rr != n-1){
        tp = Get(be,rr+1);
        Res = min(Res, max(tp.first,tp.second));
    }
}

long long find_shortcut(int N, std::vector<int> l, std::vector<int> d, int c)
{
    n = N;
    if(n>3000)return 0;
    int i, j;
    for(i=0;i<n-1;i++){
        L[i] = l[i];
    }
    for(i=0;i<n;i++){
        C[i] = d[i];
    }
    Res = INF;
    CCC = c;
    for(i=0;i<n;i++){
        Pro(i);
    }
    return Res;
}

컴파일 시 표준 에러 (stderr) 메시지

shortcut.cpp: In function 'void Pro(int)':
shortcut.cpp:75:9: warning: unused variable 'i' [-Wunused-variable]
     int i, B, E, mid, rr = be;
         ^
shortcut.cpp: In function 'long long int find_shortcut(int, std::vector<int>, std::vector<int>, int)':
shortcut.cpp:103:12: warning: unused variable 'j' [-Wunused-variable]
     int i, j;
            ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...