Submission #1129038

#TimeUsernameProblemLanguageResultExecution timeMemory
1129038pcheloveksToll (BOI17_toll)C++17
Compilation error
0 ms0 KiB
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize ("unroll-loops")
#pragma GCC target("avx,avx2,tune=native")
#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <fstream>
#include <algorithm>
#include <cstring> // Для memset

#define endl '\n'
using namespace std;

typedef long long LL;
typedef pair<LL, LL> pii;

const LL DIM = 50007;
const LL INF = INT_MAX;

LL n, k, o, m, v1, v2, t;

class edge {
public:
    LL to, w;

    edge(LL to_, LL w_) {
        to = to_;
        w = w_;
    }
};

vector < edge > v[DIM];

class tran {
public:
    LL** mat;
    tran() {
        mat = new LL* [k];
        for (int i = 0; i < k; i++) {
            mat[i] = new LL[k];
            for (int j = 0; j < k; j++) {
                mat[i][j] = INF;
            }
        }
    }
    ~tran() {
        for (int i = 0; i < k; i++) {
            delete[] mat[i];
        }
        delete[] mat;
    }
};

tran solve(LL L, LL R) {
    tran ans;
    if (R - L == 1) {
        for (int i = 0; i < k; i++) {
            LL val = L * k + i;
            for (auto to : v[val]) {
                ans.mat[i][to.to - (R * k)] = to.w;
            }
        }
        return ans;
    }

    LL mid = (L + R) / 2;

    tran m1 = solve(L, mid);
    tran m2 = solve(mid, R);

    for (int l = 0; l < k; l++) {
        for (int r = 0; r < k; r++) {
            for (int m = 0; m < k; m++) {
                ans.mat[l][r] = min(ans.mat[l][r], m1.mat[l][m] + m2.mat[m][r]);
            }
        }
    }

    return ans;
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    scanf_s("%lld %lld %lld %lld", &k, &n, &m, &o);

    for (int i = 1; i <= m; i++) {
        scanf_s("%lld %lld %lld", &v1, &v2, &t);
        v[v1].push_back({ v2, t });
    }

    vector<LL> out;

    for (int i = 1; i <= o; i++) {
        scanf_s("%lld %lld", &v1, &v2);

        LL b1 = v1 / k;
        LL b2 = v2 / k;

        if (b1 >= b2 || m == 0) {
            out.push_back(-1);
        }
        else {
            tran res = solve(b1, b2);
            LL result = res.mat[v1 - b1 * k][v2 - b2 * k];

            if (result >= INF) out.push_back(-1);
            else out.push_back(result);
        }
    }

    for (auto x : out) {
        printf("%lld\n", x);
    }

    return 0;
}

Compilation message (stderr)

toll.cpp:20:16: error: 'INT_MAX' was not declared in this scope
   20 | const LL INF = INT_MAX;
      |                ^~~~~~~
toll.cpp:12:1: note: 'INT_MAX' is defined in header '<climits>'; did you forget to '#include <climits>'?
   11 | #include <cstring> // Для memset
  +++ |+#include <climits>
   12 | 
toll.cpp: In function 'int main()':
toll.cpp:89:5: error: 'scanf_s' was not declared in this scope; did you mean 'scanf'?
   89 |     scanf_s("%lld %lld %lld %lld", &k, &n, &m, &o);
      |     ^~~~~~~
      |     scanf