답안 #558799

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
558799 2022-05-08T11:30:35 Z elazarkoren Shortcut (IOI16_shortcut) C++17
0 / 100
1 ms 340 KB
#include "shortcut.h"
#include <bits/stdc++.h>
#define x first
#define y second
#define all(v) v.begin(), v.end()
#define chkmin(a, b) a = min(a, b)
#define chkmax(a, b) a = max(a, b)
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef pair<int, int> pii;
typedef vector<pii> vii;

const int MAX_N = 1e6 + 5;
const ll infinity = 1e18;

ll prefix[MAX_N];

inline ll Dist(int l, int r) {
    if (l > r) swap(l, r);
    return prefix[r] - prefix[l];
}

ll farl[MAX_N], farr[MAX_N];
ll dpl[MAX_N], dpr[MAX_N];

ll find_shortcut(int n, vi l, vi d, int c2) {
    for (int i = 1; i < n; i++) prefix[i] = prefix[i - 1] + l[i - 1];
    farl[0] = dpl[0] = d[0];
    for (int i = 1; i < n; i++) {
        farl[i] = max<ll>(farl[i - 1] + l[i - 1], d[i]);
        dpl[i] = max<ll>(dpl[i - 1], farl[i - 1] + l[i - 1] + d[i]);
    }
    dpr[n - 1] = farr[n - 1] = d[n - 1];
    for (int i = n - 2; i >= 0; i--) {
        farr[i] = max<ll>(farr[i + 1] + l[i], d[i]);
        dpr[i] = max<ll>(dpr[i + 1], farr[i + 1] + l[i] + d[i]);
    }
    ll ans = 0;
    for (int a = 0; a < n; a++) {
        for (int b = a + 1; b < n; b++) {
            chkmax(ans, Dist(a, b) + d[a] + d[b]);
        }
    }
    for (int i = 0; i < n; i++) {
        ll circle = c2;
        for (int j = i + 1; j < n; j++) {
            ll c = min<ll>(c2, Dist(i, j));
            ll curr = max({(i ? dpl[i - 1] : 0), dpr[j + 1], (i && j + 1 < n ? farl[i - 1] + farr[j + 1] + c : 0)});
            for (int k = i; k <= j; k++) {
               if (i) {
                   ll x = min(Dist(i, k), Dist(k, j) + c) + d[k];
                   chkmax(curr, x + farl[i - 1] + l[i - 1]);
               }
               if (j + 1 < n) {
                   ll x = min(Dist(k, j), Dist(i, k) + c) + d[k];
                   chkmax(curr, x + farr[j + 1] + l[j]);
               }
            }
            circle += l[j - 1];
            priority_queue<pii> p1, p2;
            p2.push({-prefix[i] + d[i], i});
            for (int k = i + 1, h = i; k <= j; k++) {
                while (h < k && Dist(h, k) > Dist(k, j) + c + Dist(i, h)) {
                    p1.push({prefix[h] - prefix[i] + d[h], h});
                    h++;
                }
                while (!p2.empty() && p2.top().y < h) p2.pop();
                if (!p1.empty()) {
                    chkmax(curr, circle - (prefix[k] - prefix[i]) + p1.top().x + d[k]);
                }
                if (!p2.empty()) {
                    chkmax(curr, prefix[k] + p2.top().x + d[k]);
                }
                p2.push({-prefix[k] + d[k], k});
            }
//            while (!p1.empty()) p1.pop();
//            while (!p2.empty()) p2.pop();
//            p2.push({prefix[j] + d[j], j});
//            for (int k = j - 1, h = j; k >= i; k--) {
//                while (h > k && Dist(k, h) > Dist(k, i) + c + Dist(j, h)) {
//                    p1.push({circle - prefix[h] + d[h], h});
//                    h--;
//                }
//                while (!p2.empty() && p2.top().y > h) p2.pop();
//                if (!p1.empty()) {
//                    chkmax(curr, prefix[k] + p1.top().x + d[k]);
//                }
//                if (!p2.empty()) {
//                    chkmax(curr, -prefix[k] + p2.top().x + d[k]);
//                }
//                p2.push({prefix[k] + d[k], k});
//            }
            ll curr2 = 0;
            for (int a = 0; a < n; a++) {
                for (int b = a + 1; b < n; b++) {
                    ll x = min({Dist(a, b), min(Dist(a, i), Dist(a, j)) + min(Dist(b, i), Dist(b, j)) + c});
                    chkmax(curr2, x + d[a] + d[b]);
                }
            }
            if (curr != curr2) {
                cout << "";
            }
            chkmin(ans, curr);
        }
    }
    return ans;
}

ll find_shortcut2(int n, vi l, vi d, int c) {
    for (int i = 1; i < n; i++) prefix[i] = prefix[i - 1] + l[i - 1];
    ll ans = infinity;
    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            ll curr = 0;
            for (int a = 0; a < n; a++) {
                for (int b = a + 1; b < n; b++) {
                    ll x = min({Dist(a, b), min(Dist(a, i), Dist(a, j)) + min(Dist(b, i), Dist(b, j)) + c});
                    chkmax(curr, x + d[a] + d[b]);
                }
            }
            chkmin(ans, curr);
        }
    }
    return ans;
}
//3 10
//41 17
//34 0 19
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB n = 4, 80 is a correct answer
2 Correct 1 ms 212 KB n = 9, 110 is a correct answer
3 Correct 0 ms 212 KB n = 4, 21 is a correct answer
4 Correct 0 ms 212 KB n = 3, 4 is a correct answer
5 Correct 0 ms 212 KB n = 2, 62 is a correct answer
6 Correct 1 ms 304 KB n = 2, 3 is a correct answer
7 Correct 1 ms 340 KB n = 3, 29 is a correct answer
8 Correct 1 ms 340 KB n = 2, 3 is a correct answer
9 Correct 1 ms 340 KB n = 2, 3 is a correct answer
10 Correct 1 ms 340 KB n = 2, 2000000001 is a correct answer
11 Correct 1 ms 340 KB n = 2, 3000000000 is a correct answer
12 Correct 1 ms 340 KB n = 3, 3000000000 is a correct answer
13 Correct 1 ms 340 KB n = 3, 3000000000 is a correct answer
14 Correct 1 ms 340 KB n = 4, 3000000001 is a correct answer
15 Correct 1 ms 304 KB n = 4, 4000000000 is a correct answer
16 Correct 1 ms 308 KB n = 5, 4000000000 is a correct answer
17 Incorrect 1 ms 304 KB n = 10, incorrect answer: jury 1000000343 vs contestant 1000000333
18 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB n = 4, 80 is a correct answer
2 Correct 1 ms 212 KB n = 9, 110 is a correct answer
3 Correct 0 ms 212 KB n = 4, 21 is a correct answer
4 Correct 0 ms 212 KB n = 3, 4 is a correct answer
5 Correct 0 ms 212 KB n = 2, 62 is a correct answer
6 Correct 1 ms 304 KB n = 2, 3 is a correct answer
7 Correct 1 ms 340 KB n = 3, 29 is a correct answer
8 Correct 1 ms 340 KB n = 2, 3 is a correct answer
9 Correct 1 ms 340 KB n = 2, 3 is a correct answer
10 Correct 1 ms 340 KB n = 2, 2000000001 is a correct answer
11 Correct 1 ms 340 KB n = 2, 3000000000 is a correct answer
12 Correct 1 ms 340 KB n = 3, 3000000000 is a correct answer
13 Correct 1 ms 340 KB n = 3, 3000000000 is a correct answer
14 Correct 1 ms 340 KB n = 4, 3000000001 is a correct answer
15 Correct 1 ms 304 KB n = 4, 4000000000 is a correct answer
16 Correct 1 ms 308 KB n = 5, 4000000000 is a correct answer
17 Incorrect 1 ms 304 KB n = 10, incorrect answer: jury 1000000343 vs contestant 1000000333
18 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB n = 4, 80 is a correct answer
2 Correct 1 ms 212 KB n = 9, 110 is a correct answer
3 Correct 0 ms 212 KB n = 4, 21 is a correct answer
4 Correct 0 ms 212 KB n = 3, 4 is a correct answer
5 Correct 0 ms 212 KB n = 2, 62 is a correct answer
6 Correct 1 ms 304 KB n = 2, 3 is a correct answer
7 Correct 1 ms 340 KB n = 3, 29 is a correct answer
8 Correct 1 ms 340 KB n = 2, 3 is a correct answer
9 Correct 1 ms 340 KB n = 2, 3 is a correct answer
10 Correct 1 ms 340 KB n = 2, 2000000001 is a correct answer
11 Correct 1 ms 340 KB n = 2, 3000000000 is a correct answer
12 Correct 1 ms 340 KB n = 3, 3000000000 is a correct answer
13 Correct 1 ms 340 KB n = 3, 3000000000 is a correct answer
14 Correct 1 ms 340 KB n = 4, 3000000001 is a correct answer
15 Correct 1 ms 304 KB n = 4, 4000000000 is a correct answer
16 Correct 1 ms 308 KB n = 5, 4000000000 is a correct answer
17 Incorrect 1 ms 304 KB n = 10, incorrect answer: jury 1000000343 vs contestant 1000000333
18 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB n = 4, 80 is a correct answer
2 Correct 1 ms 212 KB n = 9, 110 is a correct answer
3 Correct 0 ms 212 KB n = 4, 21 is a correct answer
4 Correct 0 ms 212 KB n = 3, 4 is a correct answer
5 Correct 0 ms 212 KB n = 2, 62 is a correct answer
6 Correct 1 ms 304 KB n = 2, 3 is a correct answer
7 Correct 1 ms 340 KB n = 3, 29 is a correct answer
8 Correct 1 ms 340 KB n = 2, 3 is a correct answer
9 Correct 1 ms 340 KB n = 2, 3 is a correct answer
10 Correct 1 ms 340 KB n = 2, 2000000001 is a correct answer
11 Correct 1 ms 340 KB n = 2, 3000000000 is a correct answer
12 Correct 1 ms 340 KB n = 3, 3000000000 is a correct answer
13 Correct 1 ms 340 KB n = 3, 3000000000 is a correct answer
14 Correct 1 ms 340 KB n = 4, 3000000001 is a correct answer
15 Correct 1 ms 304 KB n = 4, 4000000000 is a correct answer
16 Correct 1 ms 308 KB n = 5, 4000000000 is a correct answer
17 Incorrect 1 ms 304 KB n = 10, incorrect answer: jury 1000000343 vs contestant 1000000333
18 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB n = 4, 80 is a correct answer
2 Correct 1 ms 212 KB n = 9, 110 is a correct answer
3 Correct 0 ms 212 KB n = 4, 21 is a correct answer
4 Correct 0 ms 212 KB n = 3, 4 is a correct answer
5 Correct 0 ms 212 KB n = 2, 62 is a correct answer
6 Correct 1 ms 304 KB n = 2, 3 is a correct answer
7 Correct 1 ms 340 KB n = 3, 29 is a correct answer
8 Correct 1 ms 340 KB n = 2, 3 is a correct answer
9 Correct 1 ms 340 KB n = 2, 3 is a correct answer
10 Correct 1 ms 340 KB n = 2, 2000000001 is a correct answer
11 Correct 1 ms 340 KB n = 2, 3000000000 is a correct answer
12 Correct 1 ms 340 KB n = 3, 3000000000 is a correct answer
13 Correct 1 ms 340 KB n = 3, 3000000000 is a correct answer
14 Correct 1 ms 340 KB n = 4, 3000000001 is a correct answer
15 Correct 1 ms 304 KB n = 4, 4000000000 is a correct answer
16 Correct 1 ms 308 KB n = 5, 4000000000 is a correct answer
17 Incorrect 1 ms 304 KB n = 10, incorrect answer: jury 1000000343 vs contestant 1000000333
18 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB n = 4, 80 is a correct answer
2 Correct 1 ms 212 KB n = 9, 110 is a correct answer
3 Correct 0 ms 212 KB n = 4, 21 is a correct answer
4 Correct 0 ms 212 KB n = 3, 4 is a correct answer
5 Correct 0 ms 212 KB n = 2, 62 is a correct answer
6 Correct 1 ms 304 KB n = 2, 3 is a correct answer
7 Correct 1 ms 340 KB n = 3, 29 is a correct answer
8 Correct 1 ms 340 KB n = 2, 3 is a correct answer
9 Correct 1 ms 340 KB n = 2, 3 is a correct answer
10 Correct 1 ms 340 KB n = 2, 2000000001 is a correct answer
11 Correct 1 ms 340 KB n = 2, 3000000000 is a correct answer
12 Correct 1 ms 340 KB n = 3, 3000000000 is a correct answer
13 Correct 1 ms 340 KB n = 3, 3000000000 is a correct answer
14 Correct 1 ms 340 KB n = 4, 3000000001 is a correct answer
15 Correct 1 ms 304 KB n = 4, 4000000000 is a correct answer
16 Correct 1 ms 308 KB n = 5, 4000000000 is a correct answer
17 Incorrect 1 ms 304 KB n = 10, incorrect answer: jury 1000000343 vs contestant 1000000333
18 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB n = 4, 80 is a correct answer
2 Correct 1 ms 212 KB n = 9, 110 is a correct answer
3 Correct 0 ms 212 KB n = 4, 21 is a correct answer
4 Correct 0 ms 212 KB n = 3, 4 is a correct answer
5 Correct 0 ms 212 KB n = 2, 62 is a correct answer
6 Correct 1 ms 304 KB n = 2, 3 is a correct answer
7 Correct 1 ms 340 KB n = 3, 29 is a correct answer
8 Correct 1 ms 340 KB n = 2, 3 is a correct answer
9 Correct 1 ms 340 KB n = 2, 3 is a correct answer
10 Correct 1 ms 340 KB n = 2, 2000000001 is a correct answer
11 Correct 1 ms 340 KB n = 2, 3000000000 is a correct answer
12 Correct 1 ms 340 KB n = 3, 3000000000 is a correct answer
13 Correct 1 ms 340 KB n = 3, 3000000000 is a correct answer
14 Correct 1 ms 340 KB n = 4, 3000000001 is a correct answer
15 Correct 1 ms 304 KB n = 4, 4000000000 is a correct answer
16 Correct 1 ms 308 KB n = 5, 4000000000 is a correct answer
17 Incorrect 1 ms 304 KB n = 10, incorrect answer: jury 1000000343 vs contestant 1000000333
18 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB n = 4, 80 is a correct answer
2 Correct 1 ms 212 KB n = 9, 110 is a correct answer
3 Correct 0 ms 212 KB n = 4, 21 is a correct answer
4 Correct 0 ms 212 KB n = 3, 4 is a correct answer
5 Correct 0 ms 212 KB n = 2, 62 is a correct answer
6 Correct 1 ms 304 KB n = 2, 3 is a correct answer
7 Correct 1 ms 340 KB n = 3, 29 is a correct answer
8 Correct 1 ms 340 KB n = 2, 3 is a correct answer
9 Correct 1 ms 340 KB n = 2, 3 is a correct answer
10 Correct 1 ms 340 KB n = 2, 2000000001 is a correct answer
11 Correct 1 ms 340 KB n = 2, 3000000000 is a correct answer
12 Correct 1 ms 340 KB n = 3, 3000000000 is a correct answer
13 Correct 1 ms 340 KB n = 3, 3000000000 is a correct answer
14 Correct 1 ms 340 KB n = 4, 3000000001 is a correct answer
15 Correct 1 ms 304 KB n = 4, 4000000000 is a correct answer
16 Correct 1 ms 308 KB n = 5, 4000000000 is a correct answer
17 Incorrect 1 ms 304 KB n = 10, incorrect answer: jury 1000000343 vs contestant 1000000333
18 Halted 0 ms 0 KB -