Submission #474278

#TimeUsernameProblemLanguageResultExecution timeMemory
474278JovanBSwapping Cities (APIO20_swap)C++17
100 / 100
495 ms47920 KiB
#include "swap.h"
#include <bits/stdc++.h>
using namespace std;

using ll = long long;
using ld = long double;

const int N = 100000;
const int LOG = 17;
const int INF = 1000000007;

int val[N+5][LOG+1];
int par[N+5][LOG+1];

vector <pair <int, int>> graf[N+5];

int tjm;
int in[N+5], out[N+5];

void dfs(int v, int p, int d){
    in[v] = ++tjm;
    par[v][0] = p;
    val[v][0] = d;
    for(int j=1; j<=LOG; j++){
        par[v][j] = par[par[v][j-1]][j-1];
        val[v][j] = max(val[v][j-1], val[par[v][j-1]][j-1]);
    }
    for(auto pr : graf[v]) if(pr.first != p) dfs(pr.first, v, pr.second);
    out[v] = tjm;
}

int moze[N+5];
int deg[N+5];
vector <int> vec[N+5];
int comp[N+5];
bool ima[N+5];

void init(int n, int m, vector <int> U, vector <int> V, vector <int> W) {
    for(int i=1; i<=n; i++) moze[i] = INF, comp[i] = i, vec[i].push_back(i);
    vector <tuple <int, int, int>> edges;
    for(int i=0; i<m; i++){
        int a = U[i] + 1;
        int b = V[i] + 1;
        int c = W[i];
        edges.push_back({c, a, b});
    }
    sort(edges.begin(), edges.end());
    for(auto e : edges){
        int c, a, b;
        tie(c, a, b) = e;
        if(comp[a] == comp[b]){
            if(ima[comp[a]]) continue;
            ima[comp[a]] = 1;
            for(auto x : vec[comp[a]]) moze[x] = c;
            continue;
        }
        graf[a].push_back({b, c});
        graf[b].push_back({a, c});
        bool novi = 0;
        deg[a]++;
        deg[b]++;
        if(deg[a] >= 3 || deg[b] >= 3) novi = 1;
        a = comp[a];
        b = comp[b];
        if(vec[a].size() < vec[b].size()) swap(a, b);
        if(!ima[a] && (novi || ima[b])){
            ima[a] = 1;
            for(auto x : vec[a]) moze[x] = c;
        }
        if(!ima[b] && (novi || ima[a])){
            ima[b] = 1;
            for(auto x : vec[b]) moze[x] = c;
        }
        for(auto x : vec[b]) comp[x] = a, vec[a].push_back(x);
        vec[b].clear();
    }
    dfs(1, 0, 0);
}

bool is_parent(int a, int b){ return (a == 0) || (in[a] <= in[b] && out[b] <= out[a]); }

int query(int x, int y){
    int res = 0;
    for(int j=LOG; j>=0; j--) if(!is_parent(par[x][j], y)) res = max(res, val[x][j]), x = par[x][j];
    if(!is_parent(x, y)) res = max(res, val[x][0]);
    for(int j=LOG; j>=0; j--) if(!is_parent(par[y][j], x)) res = max(res, val[y][j]), y = par[y][j];
    if(!is_parent(y, x)) res = max(res, val[y][0]);
    return res;
}

int getMinimumFuelCapacity(int x, int y) {
    x++;
    y++;
    int g = max(query(x, y), moze[x]);
    return (g == INF ? -1 : g);
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...