제출 #1152804

#제출 시각아이디문제언어결과실행 시간메모리
1152804alexddShortcut (IOI16_shortcut)C++20
71 / 100
1514 ms126312 KiB
#include "shortcut.h"
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int INF = 1e18;
const int MAXN = 3005;
int n,c;
int a[MAXN];//pozitii
int d[MAXN];
int worst_pref[MAXN],worst_suff[MAXN];
int only_pref[MAXN],only_suff[MAXN];
int inainte[MAXN][MAXN];
bool aux[MAXN][MAXN];
int prec[MAXN][MAXN];
bool verif(int lim)
{
    if(only_pref[n] <= lim)
        return 1;
    for(int i=0;i<=n+1;i++)
        for(int j=0;j<=n+1;j++)
            prec[i][j] = -INF;
    for(int u=n;u>0;u--)
    {
        for(int v=n;v>u;v--)
        {
            prec[u][v] = -INF;
            if(a[v] + d[v] - a[u] + d[u] > lim)
            {
                prec[u][v] = a[u] - a[v] + d[u] + d[v];
            }
            if(u<n) prec[u][v] = max(prec[u][v], prec[u+1][v]);
            aux[u][v]=1;
        }
    }
    for(int i=1;i<=n;i++)
    {
        int mxm=-INF;
        for(int j=i+2;j<=n;j++)
        {
            if(d[j-1] + a[j-1] > lim - worst_pref[i])
                mxm = max(mxm, d[j-1] - a[j-1]);
            if(mxm > lim - worst_pref[i] - a[i] - a[j] - c)
                aux[i][j]=0;

            prec[i][j] = max(prec[i][j],prec[i][j-1]);
        }
    }
    for(int j=1;j<=n;j++)
    {
        int mxm=-INF;
        for(int i=j-2;i>0;i--)
        {
            if(d[i+1] - a[i+1] > lim - worst_suff[j])
                mxm = max(mxm, d[i+1] + a[i+1]);
            if(mxm > lim - worst_suff[j] + a[i] + a[j] - c)
                aux[i][j]=0;
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=i+1;j<=n;j++)
        {
            if(c >= a[j]-a[i])
                continue;
            bool bun=1;
            if(i+1<j-1 && prec[i+1][j-1] > lim - (a[j]+c-a[i]))
                bun=0;
            if(inainte[i][j] > lim)
                bun=0;
            if(aux[i][j]==0)
                bun=0;

            if(bun)
                return 1;
        }
    }
    return 0;
}
long long find_shortcut(int32_t cit_n, std::vector<int32_t> l, std::vector<int32_t> citd, int32_t cit_c)
{
    n = cit_n;
    c = cit_c;

    for(int i=2;i<=n;i++)
        a[i] = a[i-1] + l[i-2];
    for(int i=1;i<=n;i++)
    {
        d[i] = citd[i-1];
    }

    worst_pref[0] = -INF;
    for(int i=1;i<=n;i++)
        worst_pref[i] = max(worst_pref[i-1], -a[i] + d[i]);
    worst_suff[n+1] = -INF;
    for(int i=n;i>0;i--)
        worst_suff[i] = max(worst_suff[i+1], a[i] + d[i]);

    only_pref[0] = -INF;
    for(int i=1;i<=n;i++)
        only_pref[i] = max({only_pref[i-1], a[i] + d[i] + worst_pref[i-1], d[i]});
    only_suff[n+1] = -INF;
    for(int i=n;i>0;i--)
        only_suff[i] = max({only_suff[i+1], -a[i] + d[i] + worst_suff[i+1], d[i]});

    int cv=0;
    for(int i=1;i<=n;i++)
        cv = max(cv, d[i]);
    int minim=INF;
    for(int i=1;i<=n;i++)
    {
        for(int j=i+1;j<=n;j++)
        {
            if(c >= a[j]-a[i])
                continue;
            int mxm=0;
            mxm = max(mxm, a[i] + worst_pref[i] + c + worst_suff[j] - a[j]);
            mxm = max(mxm, only_pref[i]);
            mxm = max(mxm, only_suff[j]);
            mxm = max(mxm, c);
            mxm = max(mxm, cv);
            inainte[i][j] = mxm;
            minim = min(minim, inainte[i][j]);
        }
    }

    int st=minim,dr=only_pref[n]-1,ans=only_pref[n];
    while(st<=dr)
    {
        int mij=(st+dr)/2;
        if(verif(mij))
        {
            ans = mij;
            dr = mij-1;
        }
        else
            st = mij+1;
    }
    return ans;
}
/*

4 10
10 20 20
0 40 0 30

output: 80


9 30
10 10 10 10 10 10 10 10
20 0 30 0 0 40 0 40 0

output: 110

*/

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

shortcut.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
shortcut_c.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
#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...