답안 #1069976

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1069976 2024-08-22T10:46:31 Z mc061 Shortcut (IOI16_shortcut) C++14
0 / 100
2 ms 8540 KB
#pragma once
#include <bits/stdc++.h>
using namespace std;
 
template<typename T>
using minheap = priority_queue<T, vector<T>, greater<T>>;
 
const int64_t INF = 1e18;
const int N = 3e3+6;
const int L = 13;
int64_t dist[N][N];
int64_t pref_maxA[N][N]={};
int64_t suf_maxB[N][N][13]={};
int64_t D[N];
int64_t fast_log[N];

int64_t furthest_pref[N];
int64_t furthest_suf[N];

void build_sparse(int n, int i) {
    for (int j = i+1; j < n; ++j) {
        suf_maxB[i][j][0] = D[j]+D[i]-dist[i][j];
    }
    for (int k = 1; k < L; ++k) {
        for (int j = i+1; j+(1<<k) <= n; ++j) {
            suf_maxB[i][j][k] = max(suf_maxB[i][j][k-1], suf_maxB[i][j+(1<<(k-1))][k-1]);
        }
    }
}
int64_t query_sparse(int i, int l, int r) {
    int k = fast_log[r-l+1];
    return max(suf_maxB[i][l][k], suf_maxB[i][r-(1<<k)+1][k]);
}
 
long long find_shortcut(int n, vector<int> l, vector<int> d, int c) {
    fast_log[1] = 0;
    for (int i = 2; i < N; ++i) {
        fast_log[i] = fast_log[i/2]+1;
    }
    for (int i = 0; i < n; ++i) {
        dist[i][i] = 0;
        for (int j = i+1; j < n; ++j) {
            dist[i][j] = dist[j][i] = dist[i][j-1]+l[j-1];
        }
    }

    for (int i = 0; i < n; ++i) {
        pref_maxA[i][i] = d[i];
        for (int j = i+1; j < n; ++j) {
            pref_maxA[i][j] = max(pref_maxA[i][j-1], dist[i][j]+d[i]+d[j]);
        }
    }
    for (int i = 0; i < n; ++i) {
        build_sparse(n, i);
    }
    furthest_pref[0] = d[0];
    for (int i = 1; i < n; ++i) {
        furthest_pref[i] = max<int64_t>(furthest_pref[i-1]+l[i-1], d[i]);
    }
    furthest_suf[n-1] = d[n-1];
    for (int i = n-2; i >= 0; --i) {
        furthest_suf[i] = max<int64_t>(furthest_suf[i+1]+l[i], d[i]);
    }

    int64_t res = 1e18;
    for (int i = 0; i < n; ++i) {
        multiset<pair<int64_t, int>, greater<pair<int64_t, int>>> pq[n];
        int ptr[n]={};
        for (int j = i+1; j < n; ++j) ptr[j]=j;
        int64_t tot_w = c;
        for (int j = i+1; j < n; ++j) {
            tot_w += l[j-1];
            int64_t mx = 0;
            auto upd_pr = [&] (int idx) {
                if (!(idx >= i && idx <= j)) return;
                mx = max(mx, furthest_pref[i] + min(dist[i][idx], tot_w-dist[i][idx])+d[idx]);
            };
            auto upd_suf = [&] (int idx) {
                if (!(idx >= i && idx <= j)) return;
                mx = max(mx, furthest_suf[j] + min(tot_w-dist[j][idx], dist[j][idx])+d[idx]);
            };
            for (int k = i; k <= j; ++k) {
                while (ptr[k] <= j && tot_w - dist[k][ptr[k]] >= dist[k][ptr[k]]) ++ptr[k];
                mx = max(mx, pref_maxA[k][ptr[k]-1]);
                int l = ptr[k];
                int r = j;
                if (r >= l) {
                    mx = max(mx, query_sparse(k, l, r)+tot_w);
                }
                upd_pr(k);
                upd_suf(k);
            }
            mx = max<int64_t>(mx, furthest_pref[i] + furthest_suf[j] + min<int64_t>(c, dist[i][j]));
            // cout << i << " " << j << ": " << mx << "\n";
            res = min(res, mx);
        }
    }
    return res;
}

Compilation message

shortcut.cpp:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 6492 KB n = 4, 80 is a correct answer
2 Correct 2 ms 8540 KB n = 9, 110 is a correct answer
3 Correct 1 ms 6492 KB n = 4, 21 is a correct answer
4 Correct 1 ms 6492 KB n = 3, 4 is a correct answer
5 Incorrect 1 ms 4444 KB n = 2, incorrect answer: jury 62 vs contestant 72
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 6492 KB n = 4, 80 is a correct answer
2 Correct 2 ms 8540 KB n = 9, 110 is a correct answer
3 Correct 1 ms 6492 KB n = 4, 21 is a correct answer
4 Correct 1 ms 6492 KB n = 3, 4 is a correct answer
5 Incorrect 1 ms 4444 KB n = 2, incorrect answer: jury 62 vs contestant 72
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 6492 KB n = 4, 80 is a correct answer
2 Correct 2 ms 8540 KB n = 9, 110 is a correct answer
3 Correct 1 ms 6492 KB n = 4, 21 is a correct answer
4 Correct 1 ms 6492 KB n = 3, 4 is a correct answer
5 Incorrect 1 ms 4444 KB n = 2, incorrect answer: jury 62 vs contestant 72
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 6492 KB n = 4, 80 is a correct answer
2 Correct 2 ms 8540 KB n = 9, 110 is a correct answer
3 Correct 1 ms 6492 KB n = 4, 21 is a correct answer
4 Correct 1 ms 6492 KB n = 3, 4 is a correct answer
5 Incorrect 1 ms 4444 KB n = 2, incorrect answer: jury 62 vs contestant 72
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 6492 KB n = 4, 80 is a correct answer
2 Correct 2 ms 8540 KB n = 9, 110 is a correct answer
3 Correct 1 ms 6492 KB n = 4, 21 is a correct answer
4 Correct 1 ms 6492 KB n = 3, 4 is a correct answer
5 Incorrect 1 ms 4444 KB n = 2, incorrect answer: jury 62 vs contestant 72
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 6492 KB n = 4, 80 is a correct answer
2 Correct 2 ms 8540 KB n = 9, 110 is a correct answer
3 Correct 1 ms 6492 KB n = 4, 21 is a correct answer
4 Correct 1 ms 6492 KB n = 3, 4 is a correct answer
5 Incorrect 1 ms 4444 KB n = 2, incorrect answer: jury 62 vs contestant 72
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 6492 KB n = 4, 80 is a correct answer
2 Correct 2 ms 8540 KB n = 9, 110 is a correct answer
3 Correct 1 ms 6492 KB n = 4, 21 is a correct answer
4 Correct 1 ms 6492 KB n = 3, 4 is a correct answer
5 Incorrect 1 ms 4444 KB n = 2, incorrect answer: jury 62 vs contestant 72
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 6492 KB n = 4, 80 is a correct answer
2 Correct 2 ms 8540 KB n = 9, 110 is a correct answer
3 Correct 1 ms 6492 KB n = 4, 21 is a correct answer
4 Correct 1 ms 6492 KB n = 3, 4 is a correct answer
5 Incorrect 1 ms 4444 KB n = 2, incorrect answer: jury 62 vs contestant 72
6 Halted 0 ms 0 KB -