Submission #1152685

#TimeUsernameProblemLanguageResultExecution timeMemory
1152685alexddShortcut (IOI16_shortcut)C++20
0 / 100
0 ms328 KiB
#include "shortcut.h"
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int INF = 1e18;
const int MAXN = 3005;
int a[MAXN];//pozitii
int d[MAXN];
int worst_pref[MAXN],worst_suff[MAXN];
int only_pref[MAXN],only_suff[MAXN];
long long find_shortcut(int32_t n, std::vector<int32_t> l, std::vector<int32_t> citd, int32_t 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 rez = only_pref[n];
    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, (int)c);


            for(int u=i+1;u<j;u++)
            {
                mxm = max(mxm, d[u] + worst_pref[i] + min(a[u], a[i] + c + a[j] - a[u]));
            }
            for(int u=i+1;u<j;u++)
            {
                mxm = max(mxm, d[u] + worst_suff[j] + min(-a[u], -a[j] + c + a[u] - a[i]));
            }
            for(int u=i+1;u<j;u++)
                mxm = max(mxm, d[u]);

            /*for(int u=i+1;u<j;u++)
                for(int v=u+1;v<j;v++)
                    mxm = max(mxm, d[u] + d[v] + min(a[v] - a[u], a[u] - a[v] + a[j]+c-a[i]));*/
            int st=0,dr=INF,ans=INF;
            while(st<=dr)
            {
                int mij=(st+dr)/2;

                bool bun=1;
                int mnm=INF;
                for(int u=i+1;u<j;u++)
                {
                    for(int v=u+1;v<j;v++)
                    {
                        if(a[v] + d[v] - a[u] + d[u] > mij)
                        {
                            if(a[u] - a[v] + d[u] + d[v] > mij - (a[j]+c-a[i])) bun=0;
                            if(2*a[v] - 2*a[u] > a[j]+c-a[i]) bun=0;
                            //if(2*d[u] + 2*d[v] > 2*mij - (a[j]+c-a[i])) bun=0;

                        }
                    }
                }


                if(bun)
                {
                    ans = mij;
                    dr = mij-1;
                }
                else
                    st = mij+1;
            }
            mxm = max(mxm, ans);

            //if(mxm==60) cerr<<i<<" "<<j<<" zzz\n";

            rez = min(rez, mxm);
        }
    }
    return rez;
}
/*

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

*/

Compilation message (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...