Submission #1164304

#TimeUsernameProblemLanguageResultExecution timeMemory
1164304OtalpSwapping Cities (APIO20_swap)C++20
37 / 100
2095 ms19448 KiB
#include "swap.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define pii pair<int, int>
#define ff first
#define ss second
#define unm unordered_map

vector<pii> q[200100];
int pos[200100];
vector<int> h;
int n, m;

void dfs(int v, int cl){
    pos[v] = 1;
    int sz = 0;
    for(pii e: q[v]){
        int to = e.ff;
        int w = e.ss;
        if(w > cl) continue;
        sz ++;
        if(pos[to]) continue;
        dfs(to, cl);
    }
    h.pb(sz);
}

bool check(int k, int x, int y){
    h.clear();
    for(int i=0; i<n; i++){
        pos[i] = 0;
    }
    dfs(x, k);
    if(!pos[y]) return 0;
    int ok = 0;
    int cnt = 0;
    for(int x: h){
        if(x == 1) cnt++;
        if(x > 2) ok = 1;
    }
    return (cnt != 2 or ok);
}

void init(int N, int M, vector<int> U, vector<int> V, vector<int> W) {
    n = N, m = M;
    for(int i=0; i<m; i++){
        int l = U[i], r = V[i], x = W[i];
        q[l].pb({r, x});
        q[r].pb({l, x});
    }
}

int getMinimumFuelCapacity(int X, int Y) {
    int l=1, r=1e9 + 1;
    if(!check(r, X, Y)) return -1;
    while(l < r){
        int mid = (l + r)/2;
        if(check(mid, X, Y)) r = mid;
        else l = mid + 1;
    }
    return r;
}
#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...