제출 #1362163

#제출 시각아이디문제언어결과실행 시간메모리
1362163Almonther자매 도시 (APIO20_swap)C++20
0 / 100
2095 ms27972 KiB
#include<bits/stdc++.h>
#include "swap.h"

using namespace std;

#define ll long long
const int maxn=2e5+5;
ll n,m;
vector<pair<ll,ll>>v[maxn];
vector<ll>par,dep,lo;
void init(int N, int M,
          std::vector<int> U, std::vector<int> V, std::vector<int> W) {
    n=N,m=M;
    for(int i=0;i<m;i++){
        v[U[i]].push_back({V[i],W[i]});
        v[V[i]].push_back({U[i],W[i]});
    }
}
void dfs(ll x,ll last,vector<vector<ll>>&adj){
    par[x]=last,dep[x]=lo[x]=dep[last]+1;
    for(auto i:adj[x]){
        if(i==last) continue;
        if(dep[i]==0){
            dfs(i,x,adj);
            lo[x]=min(lo[x],lo[i]);
        }
        else lo[x]=min(lo[x],dep[i]);
    }
}
bool solve(ll sz,ll X,ll Y){
    par.clear();
    lo.clear();
    dep.clear();
    par.shrink_to_fit();
    dep.shrink_to_fit();
    lo.shrink_to_fit();
    dep.resize(n+5);
    par.resize(n+5);
    lo.resize(n+5);
    vector<vector<ll>>adj;
    for(int i=0;i<n;i++){
        adj.push_back({});
        for(auto j:v[i]) if(j.second<=sz) adj.back().push_back(j.first);
    }
    dfs(X,0,adj);
    bool a=0;
    if(dep[Y]){
        if(lo[Y]!=dep[Y]) a=1;
        Y=par[Y];
        while(Y!=X){
            if(adj[Y].size()>2) a=1;
            Y=par[Y];
        }
    }
    return a;
}
int getMinimumFuelCapacity(int X, int Y) {
    ll l=0,r=1e9+1;
    while(l<r){
        ll mid=(l+r)/2;
        if(solve(mid,X,Y)) r=mid;
        else l=mid+1;
    }
    return ((r==1e9+1)?-1:r);
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…