Submission #1258081

#TimeUsernameProblemLanguageResultExecution timeMemory
1258081Bui_Quoc_CuongPassport (JOI23_passport)C++20
100 / 100
940 ms283708 KiB
#include <bits/stdc++.h>
using namespace std;
#define FOR(i, a, b) for(int i = a; i <= (int)b; i++)
#define FORD(i, a, b) for(int i = a; i >= (int)b; i--)
#define fi first
#define se second
const int N = 2e6 + 5;

int n, q;
int L[N], R[N];

int base, LIM, ID[N];
vector <pair <int, int>> g[4 * N];

void pushDown(int id, int l, int r) {
    if (l == r) {
        ID[l] = id;
        base = max(base, id);
        return;
    }
    int mid = (l + r) >> 1;
    g[id].push_back(make_pair(id << 1, 0));
    g[id].push_back(make_pair(id << 1 | 1, 0));
    pushDown(id << 1, l, mid);
    pushDown(id << 1 | 1, mid + 1, r);
}
 
void pushUp(int id, int l, int r) {
    if (l == r) {
        g[id + base].push_back(make_pair(id, 0));
        g[id].push_back(make_pair(id + base, 0));
        LIM = max(LIM, id + base);
        return;
    }
    int mid = (l + r) >> 1;
    g[id * 2 + base].push_back(make_pair(id + base, 0));    
    g[id * 2 + 1 + base].push_back(make_pair(id + base, 0));
    pushUp(id << 1, l, mid);
    pushUp(id << 1 | 1, mid + 1, r);
}
 
void addEdge(int id, int l, int r, int u, int v, int root, int w, int type) {
    if (l > v || r < u) return;
    if (l >= u && r <= v) {     
        if (type == 1 || type == 3) {
            g[id + base].push_back(make_pair(ID[root], w));
        } else {
            g[ID[root]].push_back(make_pair(id, w));
        }
        return;
    }
    int mid = (l + r) >> 1;
    addEdge(id << 1, l, mid, u, v, root, w, type);
    addEdge(id << 1 | 1, mid + 1, r, u, v, root, w, type);
}

long long dist1[N], distn[N], dist[N];

signed main() {
    ios_base::sync_with_stdio(false); cin.tie(nullptr);
    #define ko "kieuoanh"
    if (fopen(ko".inp", "r")) {
        freopen(ko".inp", "r", stdin); freopen(ko".out", "w", stdout);
    }
    cin >> n;
    FOR(i, 1, n) cin >> L[i] >> R[i];
    cin >> q;
    
    pushDown(1, 1, n);
    pushUp(1, 1, n);
    FOR(i, 1, n) addEdge(1, 1, n, L[i], R[i], i, 1, 1);

    auto dijkstra = [&] (int st, long long dist[]) {
        FOR(i, 1, LIM) dist[i] = 1e18;
        
        #define bg array <long long, 2>
        priority_queue <bg, vector <bg>, greater <bg>> pq;
        pq.push({dist[ID[st]] = 0, ID[st]});

        while (!pq.empty()) {
            int u = pq.top()[1]; 
            long long cost = pq.top()[0];
            pq.pop();
            if (cost > dist[u]) continue;
            for (pair <int, int> &it : g[u]) {
                int v = it.first, w = it.second;
                if (dist[v] > cost + w) {
                    dist[v] = cost + w;
                    pq.push({dist[v], v});
                }
            }
        }
    };

    dijkstra(1, dist1);
    dijkstra(n, distn);

    FOR(i, 1, LIM) dist[i] = 1e18;
    #define bg array <long long, 2>
    priority_queue <bg, vector <bg>, greater <bg>> pq;

    FOR(i, 1, n) {
        if (dist1[ID[i]] == 1e18) continue;
        if (distn[ID[i]] == 1e18) continue;
        long long cost = dist1[ID[i]] + distn[ID[i]] - (i != 1 && i != n);
        pq.push({dist[ID[i]] = cost, ID[i]});
    }

    while (!pq.empty()) {
        int u = pq.top()[1]; long long cost = pq.top()[0];
        pq.pop();
        if (cost > dist[u]) continue;
        for (pair <int, int> &it : g[u]) {
            int v = it.first, w = it.second;
            if (dist[v] > cost + w) {
                dist[v] = cost + w;
                pq.push({dist[v], v});
            }
        }
    }

    while (q--) {
        int u; cin >> u;
        cout << (dist[ID[u]] >= 1e18 ? - 1 : dist[ID[u]]) << "\n";
    }

    return 0;
}

Compilation message (stderr)

passport.cpp: In function 'int main()':
passport.cpp:63:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   63 |         freopen(ko".inp", "r", stdin); freopen(ko".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
passport.cpp:63:47: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   63 |         freopen(ko".inp", "r", stdin); freopen(ko".out", "w", stdout);
      |                                        ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...