Submission #1273015

#TimeUsernameProblemLanguageResultExecution timeMemory
1273015duckindogShortcut (IOI16_shortcut)C++20
71 / 100
2096 ms1340 KiB
#include <bits/stdc++.h>

#include "shortcut.h"

using namespace std;

const long long MAX = 1'000'000'000'000'000'000;

const int N = 3'000 + 10;

struct Rec { 
    long long x, y, u, v;
    Rec(long long x = -MAX, long long y = -MAX, long long u = MAX, long long v = MAX) : x(x), y(y), u(u), v(v) {}
};  
Rec merge(const Rec& a, const Rec& b) { 
    return Rec(max(a.x, b.x), max(a.y, b.y), min(a.u, b.u), min(a.v, b.v));
}

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

    auto chk = [&](long long mid) { 
        auto calRec = [&](int i, int j, long long c) { 
            return Rec(p[i] + p[j] + d[i] + d[j] - c, 
                        p[i] - p[j] + d[i] + d[j] - c, 
                        p[i] + p[j] - d[i] - d[j] + c,
                        p[i] - p[j] - d[i] - d[j] + c);
        };

        Rec rec;
        for (int i = 0; i < n; ++i) { 
            for (int j = i + 1; j < n; ++j) { 
                if (p[j] - p[i] + d[i] + d[j] <= mid) continue;
                rec = merge(rec, calRec(i, j, mid - c));
            }
        }
        if (rec.x > rec.u || rec.y > rec.v) return false;
        
        for (int i = 0; i < n; ++i) { 
            long long L = max(rec.x - p[i], rec.y + p[i]),
                        R = min(rec.u - p[i], rec.v + p[i]);
            auto it = lower_bound(p.begin(), p.end(), L);
            if (it != p.end() && *it <= R) return true;
        }
        return false;
    };

    long long le = 0, ri = MAX, ret = MAX;
    while (le <= ri) { 
        auto mid = (le + ri) >> 1;
        if (chk(mid)) ri = mid - 1, ret = mid;
        else le = mid + 1;
    }
    return ret;
}

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