Submission #1218578

#TimeUsernameProblemLanguageResultExecution timeMemory
1218578JooDdaeShortcut (IOI16_shortcut)C++20
71 / 100
2094 ms1348 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

const ll INF = 1e18;

ll find_shortcut(int n, vector<int> l, vector<int> d, int c) {
    vector<ll> p(n, 0);
    for(int i=1;i<n;i++) p[i] = p[i-1]+l[i-1];

    auto find = [&](int i, int j, ll m) -> array<ll, 4> {
        ll x = p[i], yl = p[j]-m+d[i]+d[j], yr = p[j]+m-d[i]-d[j];
        // cout << yl << " " << yr << "\n";
        return {x+yl, x-yr, x+yr, x-yl};
    };

    auto solve = [&](ll m) {
        ll xl = -INF, yl = -INF, xr = INF, yr = INF;
        for(int i=0;i<n;i++) for(int j=i+1;j<n;j++) if(p[j]-p[i]+d[j]+d[i] > m) {
            auto [XL, YL, XR, YR] = find(i, j, m-c);
            // cout << i << " " << j << " : " << XL << " " << YL << " " << XR << " " << YR << "\n";
            xl = max(xl, XL), yl = max(yl, YL);
            xr = min(xr, XR), yr = min(yr, YR);
            if(xl > xr || yl > yr) return false;
        }

        for(int i=0;i<n;i++) for(int j=i+1;j<n;j++) {
            auto [XL, YL, XR, YR] = find(i, j, d[i]+d[j]);
            if(xl <= XL && XR <= xr && yl <= YL && YR <= yr) return true;
        }

        return false;
    };

    ll s = 0, e = INF;
    while(s <= e) {
        ll m = (s+e) >> 1;
        if(solve(m)) e = m-1;
        else s = m+1;
    }
    return s;
}

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...