답안 #1061953

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1061953 2024-08-16T15:58:37 Z VMaksimoski008 Toll (BOI17_toll) C++17
7 / 100
1077 ms 8244 KB
#include <bits/stdc++.h>
//#define int long long

using namespace std;

using ll = long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;

const int mod = 1e9 + 7;
const int LOG = 20;
const int maxn = 5e4 + 5;

int K, N, M, Q;
vector<int> ans, dist(maxn);
vector<pii> g1[maxn], g2[maxn];

void D(int s, int l, int r) {
    for(int i=0; i<N; i++) dist[i] = 1e9;
    dist[s] = 0;
    priority_queue<pii, vector<pii>, greater<pii> > pq;
    
    pq.push({ 0, s });
    while(!pq.empty()) {
        auto [d, u] = pq.top(); pq.pop();
        if(d != dist[u]) continue;
        
        for(auto &[v, w] : g1[u]) {
            if(v / K > r) continue;
            if(dist[v] > dist[u] + w) {
                dist[v] = d + w;
                pq.push({ d + w, v });
            }
        }
    }

    pq.push({ 0, s });
    while(!pq.empty()) {
        auto [d, u] = pq.top(); pq.pop();
        if(d != dist[u]) continue;
        
        for(auto &[v, w] : g2[u]) {
            if(v / K < l) continue;
            if(dist[v] > dist[u] + w) {
                dist[v] = d + w;
                pq.push({ d + w, v });
            }
        }
    }
}

void f(int l, int r, vector<array<int, 3> > qus) {
    if(l > r) return ;

    int tm = (l + r) / 2;
    vector<array<int, 3> > L, R;

    for(int i=tm*K; i<min(N, tm * K + K); i++) {
        D(i, l, r);
        for(auto &[a, b, id] : qus) ans[id] = min(ans[id], dist[a] + dist[b]);
    }

    for(auto i=0; i<qus.size(); i++) {
        if(qus[i][1] / K < tm) L.push_back(qus[i]);
        if(qus[i][0] / K > tm) R.push_back(qus[i]);
    } 

    f(l, tm-1, L);
    f(tm+1, r, R);
}

signed main() {
    cin >> K >> N >> M >> Q;

    ans.resize(Q, 1e9);
    vector<array<int, 3> > qus;

    for(int i=0; i<M; i++) {
        int a, b, t;
        cin >> a >> b >> t;
        g1[a].push_back({ b, t });
        g2[b].push_back({ a, t });
    }

    for(int i=0; i<Q; i++) {
        int a, b;
        cin >> a >> b;
        if(a / K == b / K) ans[i] = -1;
        else qus.push_back({ a, b, i });
    }

    f(0, (N - 1) / K, qus);
    for(int x : ans) cout << (x == 1e9 ? -1 : x) << '\n';
    return 0;
}

Compilation message

toll.cpp: In function 'void f(int, int, std::vector<std::array<int, 3> >)':
toll.cpp:63:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::array<int, 3> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   63 |     for(auto i=0; i<qus.size(); i++) {
      |                   ~^~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 932 ms 7688 KB Output is correct
2 Correct 1 ms 2904 KB Output is correct
3 Correct 1 ms 2908 KB Output is correct
4 Correct 1 ms 2908 KB Output is correct
5 Correct 2 ms 2908 KB Output is correct
6 Correct 2 ms 2908 KB Output is correct
7 Correct 2 ms 2908 KB Output is correct
8 Correct 916 ms 7436 KB Output is correct
9 Correct 909 ms 7188 KB Output is correct
10 Correct 898 ms 3520 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1077 ms 8244 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2908 KB Output is correct
2 Correct 1 ms 2908 KB Output is correct
3 Correct 1 ms 2908 KB Output is correct
4 Correct 1 ms 2908 KB Output is correct
5 Correct 1 ms 2908 KB Output is correct
6 Correct 2 ms 2908 KB Output is correct
7 Correct 3 ms 2908 KB Output is correct
8 Incorrect 6 ms 3104 KB Output isn't correct
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2908 KB Output is correct
2 Correct 1 ms 2908 KB Output is correct
3 Correct 1 ms 2908 KB Output is correct
4 Correct 1 ms 2908 KB Output is correct
5 Correct 1 ms 2908 KB Output is correct
6 Correct 2 ms 2908 KB Output is correct
7 Correct 3 ms 2908 KB Output is correct
8 Incorrect 6 ms 3104 KB Output isn't correct
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 932 ms 7688 KB Output is correct
2 Correct 1 ms 2904 KB Output is correct
3 Correct 1 ms 2908 KB Output is correct
4 Correct 1 ms 2908 KB Output is correct
5 Correct 2 ms 2908 KB Output is correct
6 Correct 2 ms 2908 KB Output is correct
7 Correct 2 ms 2908 KB Output is correct
8 Correct 916 ms 7436 KB Output is correct
9 Correct 909 ms 7188 KB Output is correct
10 Correct 898 ms 3520 KB Output is correct
11 Incorrect 1077 ms 8244 KB Output isn't correct
12 Halted 0 ms 0 KB -