Submission #1288423

#TimeUsernameProblemLanguageResultExecution timeMemory
1288423quangminh412Evacuation plan (IZhO18_plan)C++17
100 / 100
797 ms29332 KiB
#include<bits/stdc++.h>
using namespace std;

#define ll long long

const string name = "test";

void solve();
signed main()
{
    if (fopen((name + ".inp").c_str(), "r"))
    {
        freopen((name + ".inp").c_str(), "r", stdin);
        freopen((name + ".out").c_str(), "w", stdout);
    }

    solve();

    return 0;
}

// main program
const int oo = 0x3f3f3f3f;
const int maxn = 1e5 + 1;

struct DSU
{
    vector<int> par, sz;
    int n;

    DSU(int n) : n(n)
    {
        par.resize(n + 1, 0);
        sz.resize(n + 1, 1);
        for (int i = 1; i <= n; i++)
            par[i] = i;
    }

    void reset()
    {
        for (int i = 1; i <= n; i++)
        {
            par[i] = i;
            sz[i] = 1;
        }
    }

    int find(int u) { return (u == par[u] ? u : par[u] = find(par[u])); }
    bool same(int u, int v) { return find(u) == find(v); }

    void merge(int u, int v)
    {
        u = find(u);
        v = find(v);
        if (u == v)
            return;
        if (sz[u] > sz[v])
            swap(u, v);
        par[u] = v;
        sz[v] += sz[u];
    }
};

vector<pair<int, int>> adj[maxn];
int g[maxn], dist[maxn];
int n, m, k, q;

void multisource_dijkstra()
{
    for (int i = 1; i <= n; i++)
        dist[i] = oo;
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
    for (int i = 1; i <= k; i++)
    {
        int u = g[i];
        dist[u] = 0;
        pq.push({dist[u], u});
    }

    while (!pq.empty())
    {
        int u = pq.top().second;
        int w = pq.top().first;
        pq.pop();

        if (dist[u] != w)
            continue;

        for (pair<int, int> nxt : adj[u])
        {
            int v = nxt.first;
            if (dist[v] > w + nxt.second)
                pq.push({dist[v] = w + nxt.second, v});
        }
    }
}

vector<int> values, queries[maxn];
vector<pair<int, int>> save;
int ans[maxn], L[maxn], R[maxn], S[maxn], T[maxn];
int N;

void parallel_binarysearch()
{
    DSU dsu(n);
    while (1)
    {
        bool parallel = false;
        for (int i = 1; i <= q; i++)
            if (L[i] <= R[i])
            {
                queries[L[i] + R[i] >> 1].push_back(i);
                parallel = true;
            }
        if (!parallel)
            break;
        dsu.reset();
        int cursor = 0;
        for (int i = N - 1; i >= 0; i--)
        {
            int lim = values[i];
            while (cursor < n && save[cursor].first >= lim)
            {
                int u = save[cursor].second;
                for (pair<int, int> nxt : adj[u])
                {
                    int v = nxt.first;
                    if (dist[v] >= lim)
                        dsu.merge(u, v);
                }
                cursor++;
            }
            for (int idx : queries[i])
            {
                if (dsu.same(S[idx], T[idx]))
                {
                    ans[idx] = values[i];
                    L[idx] = i + 1;
                } else
                    R[idx] = i - 1;
            }
            queries[i].clear();
        }
    }
}

void solve()
{
    cin >> n >> m;
    for (int i = 1; i <= m; i++)
    {
        int a, b, w; cin >> a >> b >> w;
        adj[a].push_back({b, w});
        adj[b].push_back({a, w});
    }
    cin >> k;
    for (int i = 1; i <= k; i++)
        cin >> g[i];

    multisource_dijkstra();

    for (int i = 1; i <= n; i++)
    {
        values.push_back(dist[i]);
        save.push_back({dist[i], i});
    }
    sort(values.begin(), values.end());
    sort(save.begin(), save.end(), greater<pair<int, int>>());
    values.erase(unique(values.begin(), values.end()), values.end());
    N = (int)values.size();

    cin >> q;
    for (int i = 1; i <= q; i++)
    {
        cin >> S[i] >> T[i];
        L[i] = 0;
        R[i] = N - 1;
    }

    parallel_binarysearch();

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

Compilation message (stderr)

plan.cpp: In function 'int main()':
plan.cpp:13:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   13 |         freopen((name + ".inp").c_str(), "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
plan.cpp:14:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   14 |         freopen((name + ".out").c_str(), "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...