답안 #906556

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
906556 2024-01-14T12:51:04 Z vjudge1 Shortcut (IOI16_shortcut) C++17
0 / 100
1 ms 600 KB
#include "shortcut.h"
#include <bits/stdc++.h>

//#pragma GCC optimize("O3")
//#pragma GCC optimize("Ofast,unroll-loops")
//#pragma GCC target("avx,avx2,fma")

using namespace std;

using vi = vector<int>;
using ll = long long;
using ii = pair<int, int>;

ll find_shortcut(int n, vi l, vi d, int c) {
    vector<ll> sl;    
    for(int i = 0; i < n - 1; ++i) {
        sl.push_back(l[i]);
        if(i) sl[i] += sl[i - 1];
    }

    auto dist_direct = [&](int u, int v) {
        if(u > v) swap(u, v);
        if(!v) return 0ll;
        if(u) return sl[v - 1] - sl[ u - 1 ];
        else return sl[v - 1];
    };
    vector<vector<ll> > DD(n, vector(n, 0ll));
    for(int i = 0; i < n; ++i)
        for(int j = 0; j < n; ++j) DD[i][j] = dist_direct(i, j);

    auto dist = [&](int u, int v, int st, int dr) { /// (st, dr) express line
        ll re = DD[u][v];
        re = min(re, DD[u][st] + DD[dr][v] + c);
        re = min(re, DD[u][dr] + DD[st][v] + c);
        return re + d[u] + d[v];
    };
    ll reg = 1e18;
    map<ii, ll> M;
    vector<ll> DPST(n, 0), DPDR(n, 0);
    for(int i = 1; i < n; ++i) {
        DPST[i] = DPST[i - 1];
        for(int j = 0; j < i; ++j)
            DPST[i] = max(DPST[i], DD[i][j]);
    }

    for(int i = n - 2; i >= 0; --i) {
        DPDR[i] = DPDR[i + 1];
        for(int j = i + 1; j < n; ++j)
            DPDR[i] = max(DPDR[i], DD[i][j]);
    }

    auto simu = [&](int st, int dr) {
        ll cre = dist(st, dr, st, dr);
        ///pt st
        ll ma1 = -1e9, ma2 = -1e9;
        for(int i = 0; i < st; ++i) ma1 = max(ma1, dist(i, st, st, dr));
        for(int i = st + 1; i < n; ++i) ma2 = max(ma2, dist(i, st, st, dr));
        cre = max(cre, ma1 + ma2 - 2 * d[st]);
        cre = max(cre, max(ma1, ma2));

        ///pt dr
        ma1 = -1e9, ma2 = -1e9;
        for(int i = 0; i < dr; ++i) ma1 = max(ma1, dist(i, dr, st, dr));
        for(int i = dr + 1; i < n; ++i) ma2 = max(ma2, dist(i, dr, st, dr));
        cre = max(cre, ma1 + ma2 - 2 * d[dr]);
        cre = max(cre, max(ma1, ma2));


        for(int i = 0; i <= st; ++i)
            for(int j = i + 1; j <= st; ++j) cre = max(cre, dist(i, j, st, dr));
        cre = max(cre, DPST[st]);
        cre = max(cre, DPDR[dr]);

        for(int i = st; i <= dr; ++i)
            for(int j = i + 1; j <= dr; ++j)
                cre = max(dist(i, j, st, dr), cre);
        return cre;
    };
    const int CBULAN = 50;
    map<int, ll> CST;
    auto cost_st = [&](int st) {
        if(CST.count(st)) return CST[st];
        ll re = 1e18;
        int l = st + 1, r = n - 1;
        while(l + CBULAN < r) {
            int m1 = (2 * l + r) / 3, m2 = (2 * r + l) / 3;
            auto c1 = simu(st, m1);
            auto c2 = simu(st, m2);
            re = min(re, c1);
            re = min(re, c2);
            if(c1 == c2) {
                auto r1 = simu(st, r);
                re = min(r1, re);
                --r;
                continue;
            }
            if(c1 > c2) {
                l = m1;
            } else r = m2;
        }
        for(int dr = l; dr <= r; ++dr) {
            auto cre = simu(st, dr);
            re = min(re, cre);
        }
        CST[st] = re;
        return re;
    };
    int st = 0, dr = n - 1;
    while(st + CBULAN < dr) {
        int m1 = (2 * st + dr) / 3, m2 = (st + 2 * dr) / 3;
        auto c1 = cost_st(m1);
        auto c2 = cost_st(m2);
        reg = min(reg, c1);
        reg = min(reg, c2);
        if(c1 == c2) {
            auto c3 = cost_st(dr);
            reg = min(reg, c3);
            --dr;
            continue;
        } else {
            if(c1 > c2) {
                st = m1;
            } else
                dr = m2;
        }
    }
    for(int i = st; i <= dr; ++i)
        reg = min(reg, cost_st(i));
    return reg; 
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB n = 4, 80 is a correct answer
2 Correct 1 ms 348 KB n = 9, 110 is a correct answer
3 Correct 0 ms 348 KB n = 4, 21 is a correct answer
4 Correct 0 ms 348 KB n = 3, 4 is a correct answer
5 Correct 0 ms 348 KB n = 2, 62 is a correct answer
6 Correct 0 ms 344 KB n = 2, 3 is a correct answer
7 Correct 1 ms 348 KB n = 3, 29 is a correct answer
8 Correct 1 ms 344 KB n = 2, 3 is a correct answer
9 Correct 1 ms 344 KB n = 2, 3 is a correct answer
10 Correct 1 ms 348 KB n = 2, 2000000001 is a correct answer
11 Correct 0 ms 348 KB n = 2, 3000000000 is a correct answer
12 Correct 0 ms 348 KB n = 3, 3000000000 is a correct answer
13 Correct 0 ms 428 KB n = 3, 3000000000 is a correct answer
14 Correct 1 ms 348 KB n = 4, 3000000001 is a correct answer
15 Correct 0 ms 348 KB n = 4, 4000000000 is a correct answer
16 Correct 0 ms 348 KB n = 5, 4000000000 is a correct answer
17 Correct 0 ms 348 KB n = 10, 1000000343 is a correct answer
18 Correct 1 ms 348 KB n = 10, 3189 is a correct answer
19 Correct 0 ms 348 KB n = 10, 7000000000 is a correct answer
20 Correct 0 ms 348 KB n = 5, 12 is a correct answer
21 Correct 1 ms 600 KB n = 5, 25 is a correct answer
22 Correct 0 ms 348 KB n = 2, 122 is a correct answer
23 Incorrect 0 ms 348 KB n = 10, incorrect answer: jury 117 vs contestant 110
24 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB n = 4, 80 is a correct answer
2 Correct 1 ms 348 KB n = 9, 110 is a correct answer
3 Correct 0 ms 348 KB n = 4, 21 is a correct answer
4 Correct 0 ms 348 KB n = 3, 4 is a correct answer
5 Correct 0 ms 348 KB n = 2, 62 is a correct answer
6 Correct 0 ms 344 KB n = 2, 3 is a correct answer
7 Correct 1 ms 348 KB n = 3, 29 is a correct answer
8 Correct 1 ms 344 KB n = 2, 3 is a correct answer
9 Correct 1 ms 344 KB n = 2, 3 is a correct answer
10 Correct 1 ms 348 KB n = 2, 2000000001 is a correct answer
11 Correct 0 ms 348 KB n = 2, 3000000000 is a correct answer
12 Correct 0 ms 348 KB n = 3, 3000000000 is a correct answer
13 Correct 0 ms 428 KB n = 3, 3000000000 is a correct answer
14 Correct 1 ms 348 KB n = 4, 3000000001 is a correct answer
15 Correct 0 ms 348 KB n = 4, 4000000000 is a correct answer
16 Correct 0 ms 348 KB n = 5, 4000000000 is a correct answer
17 Correct 0 ms 348 KB n = 10, 1000000343 is a correct answer
18 Correct 1 ms 348 KB n = 10, 3189 is a correct answer
19 Correct 0 ms 348 KB n = 10, 7000000000 is a correct answer
20 Correct 0 ms 348 KB n = 5, 12 is a correct answer
21 Correct 1 ms 600 KB n = 5, 25 is a correct answer
22 Correct 0 ms 348 KB n = 2, 122 is a correct answer
23 Incorrect 0 ms 348 KB n = 10, incorrect answer: jury 117 vs contestant 110
24 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB n = 4, 80 is a correct answer
2 Correct 1 ms 348 KB n = 9, 110 is a correct answer
3 Correct 0 ms 348 KB n = 4, 21 is a correct answer
4 Correct 0 ms 348 KB n = 3, 4 is a correct answer
5 Correct 0 ms 348 KB n = 2, 62 is a correct answer
6 Correct 0 ms 344 KB n = 2, 3 is a correct answer
7 Correct 1 ms 348 KB n = 3, 29 is a correct answer
8 Correct 1 ms 344 KB n = 2, 3 is a correct answer
9 Correct 1 ms 344 KB n = 2, 3 is a correct answer
10 Correct 1 ms 348 KB n = 2, 2000000001 is a correct answer
11 Correct 0 ms 348 KB n = 2, 3000000000 is a correct answer
12 Correct 0 ms 348 KB n = 3, 3000000000 is a correct answer
13 Correct 0 ms 428 KB n = 3, 3000000000 is a correct answer
14 Correct 1 ms 348 KB n = 4, 3000000001 is a correct answer
15 Correct 0 ms 348 KB n = 4, 4000000000 is a correct answer
16 Correct 0 ms 348 KB n = 5, 4000000000 is a correct answer
17 Correct 0 ms 348 KB n = 10, 1000000343 is a correct answer
18 Correct 1 ms 348 KB n = 10, 3189 is a correct answer
19 Correct 0 ms 348 KB n = 10, 7000000000 is a correct answer
20 Correct 0 ms 348 KB n = 5, 12 is a correct answer
21 Correct 1 ms 600 KB n = 5, 25 is a correct answer
22 Correct 0 ms 348 KB n = 2, 122 is a correct answer
23 Incorrect 0 ms 348 KB n = 10, incorrect answer: jury 117 vs contestant 110
24 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB n = 4, 80 is a correct answer
2 Correct 1 ms 348 KB n = 9, 110 is a correct answer
3 Correct 0 ms 348 KB n = 4, 21 is a correct answer
4 Correct 0 ms 348 KB n = 3, 4 is a correct answer
5 Correct 0 ms 348 KB n = 2, 62 is a correct answer
6 Correct 0 ms 344 KB n = 2, 3 is a correct answer
7 Correct 1 ms 348 KB n = 3, 29 is a correct answer
8 Correct 1 ms 344 KB n = 2, 3 is a correct answer
9 Correct 1 ms 344 KB n = 2, 3 is a correct answer
10 Correct 1 ms 348 KB n = 2, 2000000001 is a correct answer
11 Correct 0 ms 348 KB n = 2, 3000000000 is a correct answer
12 Correct 0 ms 348 KB n = 3, 3000000000 is a correct answer
13 Correct 0 ms 428 KB n = 3, 3000000000 is a correct answer
14 Correct 1 ms 348 KB n = 4, 3000000001 is a correct answer
15 Correct 0 ms 348 KB n = 4, 4000000000 is a correct answer
16 Correct 0 ms 348 KB n = 5, 4000000000 is a correct answer
17 Correct 0 ms 348 KB n = 10, 1000000343 is a correct answer
18 Correct 1 ms 348 KB n = 10, 3189 is a correct answer
19 Correct 0 ms 348 KB n = 10, 7000000000 is a correct answer
20 Correct 0 ms 348 KB n = 5, 12 is a correct answer
21 Correct 1 ms 600 KB n = 5, 25 is a correct answer
22 Correct 0 ms 348 KB n = 2, 122 is a correct answer
23 Incorrect 0 ms 348 KB n = 10, incorrect answer: jury 117 vs contestant 110
24 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB n = 4, 80 is a correct answer
2 Correct 1 ms 348 KB n = 9, 110 is a correct answer
3 Correct 0 ms 348 KB n = 4, 21 is a correct answer
4 Correct 0 ms 348 KB n = 3, 4 is a correct answer
5 Correct 0 ms 348 KB n = 2, 62 is a correct answer
6 Correct 0 ms 344 KB n = 2, 3 is a correct answer
7 Correct 1 ms 348 KB n = 3, 29 is a correct answer
8 Correct 1 ms 344 KB n = 2, 3 is a correct answer
9 Correct 1 ms 344 KB n = 2, 3 is a correct answer
10 Correct 1 ms 348 KB n = 2, 2000000001 is a correct answer
11 Correct 0 ms 348 KB n = 2, 3000000000 is a correct answer
12 Correct 0 ms 348 KB n = 3, 3000000000 is a correct answer
13 Correct 0 ms 428 KB n = 3, 3000000000 is a correct answer
14 Correct 1 ms 348 KB n = 4, 3000000001 is a correct answer
15 Correct 0 ms 348 KB n = 4, 4000000000 is a correct answer
16 Correct 0 ms 348 KB n = 5, 4000000000 is a correct answer
17 Correct 0 ms 348 KB n = 10, 1000000343 is a correct answer
18 Correct 1 ms 348 KB n = 10, 3189 is a correct answer
19 Correct 0 ms 348 KB n = 10, 7000000000 is a correct answer
20 Correct 0 ms 348 KB n = 5, 12 is a correct answer
21 Correct 1 ms 600 KB n = 5, 25 is a correct answer
22 Correct 0 ms 348 KB n = 2, 122 is a correct answer
23 Incorrect 0 ms 348 KB n = 10, incorrect answer: jury 117 vs contestant 110
24 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB n = 4, 80 is a correct answer
2 Correct 1 ms 348 KB n = 9, 110 is a correct answer
3 Correct 0 ms 348 KB n = 4, 21 is a correct answer
4 Correct 0 ms 348 KB n = 3, 4 is a correct answer
5 Correct 0 ms 348 KB n = 2, 62 is a correct answer
6 Correct 0 ms 344 KB n = 2, 3 is a correct answer
7 Correct 1 ms 348 KB n = 3, 29 is a correct answer
8 Correct 1 ms 344 KB n = 2, 3 is a correct answer
9 Correct 1 ms 344 KB n = 2, 3 is a correct answer
10 Correct 1 ms 348 KB n = 2, 2000000001 is a correct answer
11 Correct 0 ms 348 KB n = 2, 3000000000 is a correct answer
12 Correct 0 ms 348 KB n = 3, 3000000000 is a correct answer
13 Correct 0 ms 428 KB n = 3, 3000000000 is a correct answer
14 Correct 1 ms 348 KB n = 4, 3000000001 is a correct answer
15 Correct 0 ms 348 KB n = 4, 4000000000 is a correct answer
16 Correct 0 ms 348 KB n = 5, 4000000000 is a correct answer
17 Correct 0 ms 348 KB n = 10, 1000000343 is a correct answer
18 Correct 1 ms 348 KB n = 10, 3189 is a correct answer
19 Correct 0 ms 348 KB n = 10, 7000000000 is a correct answer
20 Correct 0 ms 348 KB n = 5, 12 is a correct answer
21 Correct 1 ms 600 KB n = 5, 25 is a correct answer
22 Correct 0 ms 348 KB n = 2, 122 is a correct answer
23 Incorrect 0 ms 348 KB n = 10, incorrect answer: jury 117 vs contestant 110
24 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB n = 4, 80 is a correct answer
2 Correct 1 ms 348 KB n = 9, 110 is a correct answer
3 Correct 0 ms 348 KB n = 4, 21 is a correct answer
4 Correct 0 ms 348 KB n = 3, 4 is a correct answer
5 Correct 0 ms 348 KB n = 2, 62 is a correct answer
6 Correct 0 ms 344 KB n = 2, 3 is a correct answer
7 Correct 1 ms 348 KB n = 3, 29 is a correct answer
8 Correct 1 ms 344 KB n = 2, 3 is a correct answer
9 Correct 1 ms 344 KB n = 2, 3 is a correct answer
10 Correct 1 ms 348 KB n = 2, 2000000001 is a correct answer
11 Correct 0 ms 348 KB n = 2, 3000000000 is a correct answer
12 Correct 0 ms 348 KB n = 3, 3000000000 is a correct answer
13 Correct 0 ms 428 KB n = 3, 3000000000 is a correct answer
14 Correct 1 ms 348 KB n = 4, 3000000001 is a correct answer
15 Correct 0 ms 348 KB n = 4, 4000000000 is a correct answer
16 Correct 0 ms 348 KB n = 5, 4000000000 is a correct answer
17 Correct 0 ms 348 KB n = 10, 1000000343 is a correct answer
18 Correct 1 ms 348 KB n = 10, 3189 is a correct answer
19 Correct 0 ms 348 KB n = 10, 7000000000 is a correct answer
20 Correct 0 ms 348 KB n = 5, 12 is a correct answer
21 Correct 1 ms 600 KB n = 5, 25 is a correct answer
22 Correct 0 ms 348 KB n = 2, 122 is a correct answer
23 Incorrect 0 ms 348 KB n = 10, incorrect answer: jury 117 vs contestant 110
24 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB n = 4, 80 is a correct answer
2 Correct 1 ms 348 KB n = 9, 110 is a correct answer
3 Correct 0 ms 348 KB n = 4, 21 is a correct answer
4 Correct 0 ms 348 KB n = 3, 4 is a correct answer
5 Correct 0 ms 348 KB n = 2, 62 is a correct answer
6 Correct 0 ms 344 KB n = 2, 3 is a correct answer
7 Correct 1 ms 348 KB n = 3, 29 is a correct answer
8 Correct 1 ms 344 KB n = 2, 3 is a correct answer
9 Correct 1 ms 344 KB n = 2, 3 is a correct answer
10 Correct 1 ms 348 KB n = 2, 2000000001 is a correct answer
11 Correct 0 ms 348 KB n = 2, 3000000000 is a correct answer
12 Correct 0 ms 348 KB n = 3, 3000000000 is a correct answer
13 Correct 0 ms 428 KB n = 3, 3000000000 is a correct answer
14 Correct 1 ms 348 KB n = 4, 3000000001 is a correct answer
15 Correct 0 ms 348 KB n = 4, 4000000000 is a correct answer
16 Correct 0 ms 348 KB n = 5, 4000000000 is a correct answer
17 Correct 0 ms 348 KB n = 10, 1000000343 is a correct answer
18 Correct 1 ms 348 KB n = 10, 3189 is a correct answer
19 Correct 0 ms 348 KB n = 10, 7000000000 is a correct answer
20 Correct 0 ms 348 KB n = 5, 12 is a correct answer
21 Correct 1 ms 600 KB n = 5, 25 is a correct answer
22 Correct 0 ms 348 KB n = 2, 122 is a correct answer
23 Incorrect 0 ms 348 KB n = 10, incorrect answer: jury 117 vs contestant 110
24 Halted 0 ms 0 KB -