Submission #331162

# Submission time Handle Problem Language Result Execution time Memory
331162 2020-11-27T16:05:36 Z arujbansal Swapping Cities (APIO20_swap) C++17
Compilation error
0 ms 0 KB
#ifndef arujbansal_local
#include "swap.h"
#endif

#include <bits/stdc++.h>

#define FAST_IO ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)
#define setIO(i, o) freopen(i, "r", stdin), freopen(o, "w", stdout)
#define rand_init mt19937 rng(chrono::steady_clock::now().time_since_epoch().count())
#define pb push_back
#define eb emplace_back
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define sz(x) (int) (x).size()
#define lc(i) 2*i
#define rc(i) 2*i+1
//#define int long long
using namespace std;
using ll = long long;
using ii = pair<int, int>;
using vii = vector<ii>;
using vi = vector<int>;
using vvi = vector<vi>;
using vb = vector<bool>;
using vvb = vector<vb>;

//rand_init;

const int MAXN = 2e5 + 5, MOD = 1e9 + 7, INF = 1e9 + 5;

struct Edge {
    int u, v, w;

    Edge(int u, int v, int w) : u(u), v(v), w(w) {}

    bool operator<(const Edge &other) {
        return w < other.w;
    }
};

int n, m, fakeNode, timer = 0;
const int MAXK = 20;
vector<Edge> edges;
vi par, compSize;
vi g[MAXN];
int cost[MAXN], deg[MAXN], binlift[MAXN][MAXK], minCost[MAXN], tin[MAXN], tout[MAXN];
bool valid[MAXN];

void addEdge(int u, int w) {
    g[u].pb(fakeNode);
    g[fakeNode].pb(u);

    cost[fakeNode] = w;
    valid[fakeNode] |= valid[u];
}

int get(int x) {
    return (par[x] == x ? x : par[x] = get(par[x]));
}

void unite(int x, int y, int w) {
    int u = get(x), v = get(y);

    deg[x]++;
    deg[y]++;

    valid[u] |= (deg[x] >= 3);
    valid[v] |= (deg[y] >= 3);

    u = get(u), v = get(v);

    if (u == v) {
        addEdge(u, w);
        valid[fakeNode++] = true;
        return;
    }

    addEdge(u, w);
    addEdge(v, w);
    fakeNode++;

    if (compSize[u] < compSize[v]) swap(u, v);

    compSize[u] += compSize[v];
    par[v] = u;
}

void dfs(int u = 0, int p = -1) {
    if (valid[u]) minCost[u] = cost[u];

    if (p != -1) {
        binlift[u][0] = p;
        minCost[u] = min(minCost[u], minCost[p]);
    }

    tin[u] = timer++;

    for (int j = 1; j < MAXK; j++)
        binlift[u][j] = binlift[binlift[u][j - 1]][j - 1];

    for (const auto &v : g[u])
        if (v != p)
            dfs(v, u);

    tout[u] = timer - 1;
}

bool isAnc(int x, int y) {
    return (tin[x] <= tin[y] && tout[x] >= tout[y]);
}

int queryLCA(int u, int v) {
    if (isAnc(u, v)) return u;
    if (isAnc(v, u)) return v;

    for (int j = MAXK - 1; j >= 0; j--)
        if (!isAnc(binlift[u][j], v))
            u = binlift[u][j];

    return binlift[u][0];
}

void init(int N, int M, vi U, vi V, vi W) {
    n = N, m = M;

    for (int i = 0; i < m; i++)
        edges.eb(U[i], V[i], W[i]);

    sort(all(edges));

    // Initialise UFDS stuff
    par.resize(n);
    iota(all(par), 0);
    compSize.assign(n, 1);
    fakeNode = n;

    for (const auto &[u, v, w] : edges)
        unite(u, v, w);

    dfs();
}

int getMinimumFuelCapacity(int X, int Y) {
    int lca = queryLCA(X, Y);

    return (valid[lca] ? minCost[lca] : -1);
}

void solve() {
    int a, b;
    cin >> a >> b;
    vi u(b), v(b), wt(b);

    for (int i = 0; i < b; i++)
        cin >> u[i] >> v[i] >> wt[i];

    init(a, b, u, v, wt);

    int q;
    cin >> q;
    while (q--) {
        int x, y;
        cin >> x >> y;
        cout << getMinimumFuelCapacity(x, y) << "\n";
    }
}

signed main() {
    FAST_IO;
#ifdef arujbansal_local
    setIO("input.txt", "output.txt");
#endif

    int tc = 1;
//    cin >> tc;
    while (tc--) solve();
}

Compilation message

/tmp/cctCWAXB.o: In function `main':
grader.cpp:(.text.startup+0x0): multiple definition of `main'
/tmp/ccdgRB0N.o:swap.cpp:(.text.startup+0x0): first defined here
collect2: error: ld returned 1 exit status