Submission #1360293

#TimeUsernameProblemLanguageResultExecution timeMemory
1360293bncodero_o123Evacuation plan (IZhO18_plan)C++20
100 / 100
287 ms28056 KiB
#include <bits/stdc++.h>
#define NAME "code"
#define ll long long
#define ull unsigned ll
#define pii pair<int, int>
#define pll pair<ll, ll>
#define fi first
#define se second
using namespace std;

const int N= 1e5;
int n, m, k, q;
int g[N + 5];
vector<pii> adj[N + 5];
pii que[N + 5];

struct DSU {
    int lab[N + 5];

    void make_set() {
        fill_n(lab + 1, n, -1);
    }

    int find_set(int u) {
        if(lab[u] < 0) return u;
        return lab[u]= find_set(lab[u]);
    }

    void union_set(int u, int v) {
        u= find_set(u);
        v= find_set(v);
        if(u != v) {
            if(lab[u] > lab[v]) swap(u, v);
            lab[u] += lab[v], lab[v]= u;
        }
    }

    bool check(int u, int v) {
        return find_set(u) == find_set(v);
    }
} dsu;

int dist[N + 5];

void prep() {
    fill_n(dist + 1, n, 1e9);
    priority_queue<pii> pq;
    for(int i= 1; i <= k; ++i) {
        dist[g[i]]= 0;
        pq.push({0, g[i]});
    }

    while(pq.size()) {
        auto [d, u]= pq.top(); pq.pop();
        if(-d != dist[u]) continue;
        for(auto [v, w] : adj[u])
            if(dist[v] > dist[u] + w) {
                dist[v]= dist[u] + w;
                pq.push({-dist[v], v});
            }
    }
}

int num;
vector<int> val, have[N + 5];

void init() {
    for(int i= 1; i <= n; ++i)
        val.push_back(dist[i]);
    sort(val.begin(), val.end());
    num= unique(val.begin(), val.end()) - val.begin();
    val.resize(num);
    for(int i= 1; i <= n; ++i) {
        int id= lower_bound(val.begin(), val.end(), dist[i]) - val.begin();
        have[id].push_back(i);
    }
}

int L[N + 5], R[N + 5];
int ans[N + 5];
bool act[N + 5];
vector<int> lis[N + 5];

void solve() {
    cin >> n >> m;
    for(int i= 1; i <= m; ++i) {
        int u, v, w;
        cin >> u >> v >> w;
        adj[u].push_back({v, w});
        adj[v].push_back({u, w});
    }
    cin >> k;
    for(int i= 1; i <= k; ++i)
        cin >> g[i];
    cin >> q;
    for(int i= 1; i <= q; ++i) {
        auto& [s, t]= que[i];
        cin >> s >> t;
    }

    prep();
    init();
    for(int i= 1; i <= q; ++i) {
        R[i]= num - 1;
        lis[(num - 1) >> 1].push_back(i);
    }

    bool cond= 1;
    while(cond) {
        dsu.make_set();
        fill_n(act + 1, n, 0);
        for(int mid= num - 1; mid >= 0; --mid) {
            for(int u : have[mid]) {
                act[u]= 1;
                for(auto [v, w] : adj[u])
                    if(act[v])
                        dsu.union_set(u, v);
            }
            for(int i : lis[mid]) {
                auto [s, t]= que[i];
                if(dsu.check(s, t)) ans[i]= mid, L[i]= mid + 1;
                else R[i]= mid - 1;
            }
            lis[mid].clear();
        }

        cond= 0;
        for(int i= 1; i <= q; ++i)
            if(L[i] <= R[i]) {
                lis[(L[i] + R[i]) >> 1].push_back(i);
                cond= 1;
            }
    }

    for(int i= 1; i <= q; ++i)
        cout << val[ans[i]] << '\n';
}

signed main() {
    if(fopen(NAME".inp", "r")) {
        freopen(NAME".inp", "r", stdin);
        freopen(NAME".out", "w", stdout);
    }
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    int tests= 1;
    for(int i= 0; i < tests; ++i)
        solve();

    return 0;
}

Compilation message (stderr)

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