Submission #1250908

#TimeUsernameProblemLanguageResultExecution timeMemory
1250908neisennEvacuation plan (IZhO18_plan)C++20
100 / 100
1274 ms116972 KiB
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define eb emplace_back
#define ppb pop_back
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, int> pli;
typedef pair<ll, ll> pll;
const char nl = '\n';
const int inf = 1e9;

struct DSU {
    vector<int> par, sz;
    DSU (int n){
        par.resize(n+1);
        sz.assign(n+1, 1);
        iota(par.begin(), par.end(), 0);
    }
    int find(int x){
        if (par[x] == x) return x;
        return par[x] = find(par[x]);
    }
    bool uni(int a, int b){
        a = find(a), b = find(b);
        if (a == b) return 0;
        if (sz[a] < sz[b]) swap(a, b);
        sz[a] += par[b], par[b] = a;
        return 1;
    }
    bool is(int a, int b){
        return find(a) == find(b);
    }
};

void solve(){
    int n, m, u, v, w;
    cin >> n >> m;
    vector<vector<vector<int>>> adj(n+1);
    vector<vector<int>> ed;
    for (int i = 0; i < m; i++){
        cin >> u >> v >> w;
        adj[u].pb({v, w});
        adj[v].pb({u, w});
        ed.pb({u, v});
    }
    vector<int> dis(n+1, inf);
    set<vector<int>> s;
    int k; cin >> k;
    for (int i = 1; i <= k; i++){
        cin >> u;
        dis[u] = 0;
        s.insert({0, u});
    }
    while (s.size()){
        int cur = s.begin()->at(1), d = s.begin()->at(0);
        s.erase(s.begin());
        if (d != dis[cur]) continue;
        for (auto ch : adj[cur]){
            if (dis[ch[0]] > dis[cur]+ch[1]){
                dis[ch[0]] = dis[cur]+ch[1];
                s.insert({dis[ch[0]], ch[0]});
            }
        }
    }
    for (int i = 0; i < m; i++){
        ed[i].pb(min(dis[ed[i][0]], dis[ed[i][1]]));
        swap(ed[i][0], ed[i][2]);
    }
    sort(ed.begin(), ed.end());
    reverse(ed.begin(), ed.end());
    int q; cin >> q;
    vector<vector<int>> qu;
    for (int i = 1; i <= q; i++){
        cin >> u >> v;
        qu.pb({0, inf, -1, u, v});
    }
    int it = 30;
    while (it--){
        vector<vector<int>> lst;
        for (int i = 0; i < q; i++){
            if (qu[i][0] > qu[i][1]) continue;
            int mid = (qu[i][0]+qu[i][1])/2;
            lst.pb({mid, i});
        }
        sort(lst.rbegin(), lst.rend());
        DSU dsu(n);
        int id = 0;
        for (auto ch : lst){
            int a = ch[1];
            while (id < m && ed[id][0] >= ch[0]){
                dsu.uni(ed[id][1], ed[id][2]);
                id++;
            }
            if (dsu.is(qu[a][3], qu[a][4])){
                qu[a][2] = ch[0];
                qu[a][0] = ch[0]+1;
            }
            else {
                qu[a][1]  = ch[0]-1;
            }
        }
    }
    for (int i = 0; i < q; i++){
        cout << qu[i][2] << nl;
    }
}

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

    int t = 1; // cin >> t;
    while (t--){
        solve();
    }
}
#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...