| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 1098429 | vjudge1 | Evacuation plan (IZhO18_plan) | C++17 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#pragma GCC optimize("Ofast")
#pragma comment(linker, "/stack:200000000")
#pragma GCC target( "sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native" )
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("profile-values,profile-reorder-functions,tracer")
#pragma GCC optimize("vpt")
#pragma GCC optimize("rename-registers")
#pragma GCC optimize("move-loop-invariants")
#pragma GCC optimize("unswitch-loops")
#pragma GCC optimize("function-sections")
#pragma GCC optimize("data-sections")
#pragma GCC optimize("branch-target-load-optimize")
#pragma GCC optimize("branch-target-load-optimize2")
#pragma GCC optimize("btr-bb-exclusive")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#include<bits/stdc++.h>
#define ll int
#define F first
#define S second
#define ull unsigned long long
#define db double
#define ldb long double
#define pb push_back
#define pf push_front
#define ppb pop_back
#define ppf pop_front
#define yes cout<<"YES\n"
#define no cout<<"NO\n"
#define all(x) x.begin(), x.end()
const int mod = 1e9 + 7;
const int N = 1e5 + 1;
using namespace std;
ll n, m, p[N], a, b, c, d[N], l, r, used[N], res, pr[N], dep[N], t[N], is[N], v, w;
vector <ll> st;
set <pair <ll, ll>> s;
vector <pair <ll, ll>> q, g[N];
ll get (ll a, ll time){
if (a == pr[a] || t[a] < time){
return a;
}
return get (pr[a], time);
}
void un (ll a, ll b, ll time){
a = get (a, time);
b = get (b, time);
if (a == b){
return;
}
if (dep[a] > dep[b]){
swap (a, b);
}
pr[a] = b;
t[a] = time;
dep[b] = max (dep[b], dep[a] + 1);
}
signed main (){
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= m; i++){
cin >> a >> b >> c;
g[a].pb({b, c});
g[b].pb ({a, c});
}
for (int i = 1; i <= n; i++){
d[i] = 1e9;
}
cin >> m;
for (int i = 1; i <= m; i++){
cin >> p[i];
d[p[i]] = 0;
is[p[i]] = 1;
s.insert({0, p[i]});
}
while (s.size()){
pair <ll, ll> opa = *s.begin();
v = opa.second, w = opa.F;
s.erase (opa);
is[v] = 0;
for (int i = 0; i < g[v].size(); i++){
if (d[g[v][i].F] > w + g[v][i].S){
if (is[g[v][i].F])s.erase ({d[g[v][i].F], g[v][i].F});
d[g[v][i].F] = w + g[v][i].S;
is[g[v][i].F] = 1;
s.insert ({d[g[v][i].F], g[v][i].F});
}
}
}
for (int i = 1; i <= n; i++){
pr[i] = i;
dep[i] = 1;
q.pb ({d[i], i});
st.pb(d[i]);
}
sort (all (q));
sort (all (st));
a = q.size() - 1;
for (int i = st.size() - 1; i >= 0; i--){
while (a >= 0 && q[a].F >= st[i]){
for (int y = 0; y < g[q[a].S].size(); y++){
if (d[g[q[a].S][y].F] >= st[i])un (q[a].S, g[q[a].S][y].F, st[i]);
}
a--;
}
}
cin >> m;
while (m--){
cin >> a >> b;
l = 0, r = st.size() - 1, res = 0;
while (l <= r){
ll md = (l + r) / 2;
if (get (a, st[md]) == get (b, st[md])){
l = md + 1;
res = md;
}
else{
r = md - 1;
}
}
cout << st[res] << '\n';
}
}