답안 #371562

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
371562 2021-02-26T21:59:08 Z dolphingarlic Shortcut (IOI16_shortcut) C++14
0 / 100
1 ms 364 KB
#include "shortcut.h"

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;

const ll INF = 1e13;

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];

    // Order the stations by their inequality stuff
    vector<pair<ll, int>> iot(n);
    vector<int> ord(n);
    // Order by d[i] + p[i]
    for (int i = 0; i < n; i++) iot[i] = {d[i] + p[i], i};
    sort(iot.begin(), iot.end());
    for (int i = 0; i < n; i++) ord[iot[i].second] = i;

    // Binary search for the answer
    ll lo = 0, hi = INF;
    while (lo != hi) {
        ll mid = (lo + hi) >> 1;

        vector<ll> half_plane(4, -INF);
        ll mx1 = -INF, mx2 = -INF;
        for (int i = n - 1, lptr = n - 1; ~i; i--) {
            while (lptr > i && mid - d[i] + p[i] < iot[lptr].first) {
                mx1 = max(mx1, d[lptr] + p[lptr]);
                mx2 = max(mx2, d[lptr] - p[lptr]);
                lptr--;
            }
            // Update the half planes
            half_plane[0] = max(half_plane[0], c - mid + d[i] + p[i] + mx1);
            half_plane[1] = max(half_plane[1], c - mid + d[i] - p[i] + mx1);
            half_plane[2] = max(half_plane[2], c - mid + d[i] + p[i] + mx2);
            half_plane[3] = max(half_plane[3], c - mid + d[i] - p[i] + mx2);
        }

        // Check that the half-planes have a common intersection
        bool good = false;
        // Point (x, y) is below the half-plane intersection if y < max(-x + half_plane[0], x + half_plane[1])
        // Point (x, y) is above the half-plane intersection if y > min(-x - half_plane[3], x - half_plane[2])
        for (int i = 0, lower = n - 1, upper = 0; i < n; i++) {
            while (lower >= 0 && p[lower] >= max(-p[i] + half_plane[0], p[i] + half_plane[1]))
                lower--;
            while (lower + 1 < n && p[lower + 1] < max(-p[i] + half_plane[0], p[i] + half_plane[1]))
                lower++;
            while (upper < n && p[upper] <= min(-p[i] - half_plane[3], p[i] - half_plane[2]))
                upper++;
            while (upper > 0 && p[upper - 1] > min(-p[i] - half_plane[3], p[i] - half_plane[2]))
                upper--;

            if (upper - lower > 1) {
                good = true;
                break;
            }
        }
        if (good) hi = mid;
        else lo = mid + 1;
    }
    return lo;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 364 KB n = 4, 80 is a correct answer
2 Incorrect 1 ms 364 KB n = 9, incorrect answer: jury 110 vs contestant 100
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 364 KB n = 4, 80 is a correct answer
2 Incorrect 1 ms 364 KB n = 9, incorrect answer: jury 110 vs contestant 100
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 364 KB n = 4, 80 is a correct answer
2 Incorrect 1 ms 364 KB n = 9, incorrect answer: jury 110 vs contestant 100
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 364 KB n = 4, 80 is a correct answer
2 Incorrect 1 ms 364 KB n = 9, incorrect answer: jury 110 vs contestant 100
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 364 KB n = 4, 80 is a correct answer
2 Incorrect 1 ms 364 KB n = 9, incorrect answer: jury 110 vs contestant 100
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 364 KB n = 4, 80 is a correct answer
2 Incorrect 1 ms 364 KB n = 9, incorrect answer: jury 110 vs contestant 100
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 364 KB n = 4, 80 is a correct answer
2 Incorrect 1 ms 364 KB n = 9, incorrect answer: jury 110 vs contestant 100
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 364 KB n = 4, 80 is a correct answer
2 Incorrect 1 ms 364 KB n = 9, incorrect answer: jury 110 vs contestant 100
3 Halted 0 ms 0 KB -