Submission #1183839

#TimeUsernameProblemLanguageResultExecution timeMemory
1183839kiwimsyDreaming (IOI13_dreaming)C++20
0 / 100
1096 ms131072 KiB
#include "dreaming.h" #include <bits/stdc++.h> #define ll long long using namespace std; vector<vector<pair<ll, ll>>> adj; vector<bool> vis, dvis; vector<ll> diapath, diaedges; void getpath(ll a, ll b, ll N, vector<ll> path = {}, vector<ll> edges = {}){ path.push_back(a); dvis[a] = true; if(a == b){ diapath = path; diaedges = edges; return; } edges.push_back(0); for(pair<ll, ll> i : adj[a]){ if(!dvis[i.first]){ edges[edges.size()-1] = i.second; getpath(i.first, b, N, path, edges); } } } void diameter(ll node, ll N){ diapath.clear(), diaedges.clear(); ll a = 0, b = 0, dist = 0; dvis = vis; queue<pair<ll, ll>> q; queue<tuple<ll, ll, ll>> qd; vector<ll> dia(N, -1), edges(N), parent(N); q.push({node, 0}); while(!q.empty()){ pair<ll, ll> val = q.front(); q.pop(); if(dvis[val.first]) continue; for(pair<ll, ll> i : adj[val.first]){ if(!dvis[i.first]){ q.push({i.first, i.second + val.second}); if(i.second + val.second > dist){ a = i.first; dist = i.second + val.second; } } } dvis[val.first] = true; } qd.push({a, 0, 0}); dvis = vis, dist = 0; dia[0] = a; while(!qd.empty()){ tuple<ll, ll, ll> val = qd.front(); qd.pop(); if(dvis[get<0>(val)]) continue; for(pair<ll, ll> i : adj[get<0>(val)]){ if(!dvis[i.first]){ qd.push({i.first, get<1>(val) + 1, i.second + get<2>(val)}); if(i.second + get<2>(val) > dist){ dist = i.second + get<2>(val); b = i.first; } } } dvis[get<0>(val)] = true; } dvis = vis; getpath(a, b, N); vis = dvis; } int travelTime(int N, int M, int L, int A[], int B[], int T[]) { adj.resize(N); ll ret = 0, bigcenter = 0, maxdia = 0; vector<ll> centers; for(ll i = 0; i < M; i++){ adj[A[i]].push_back({B[i], T[i]}); adj[B[i]].push_back({A[i], T[i]}); } vis.assign(N, false); for(ll i = 0; i < N; i++){ if(!vis[i]){ diameter(i, N); vis[i] = true; ll c = i, c1 = i, c2 = i, w1 = 0, w2 = 0, dialength = 0; for(ll j : diaedges) dialength += j; if(dialength > 0){ for(ll j = 1; w1 <= dialength / 2; j++){ c1 = diapath[j]; w1 += diaedges[j-1]; } for(ll j = diapath.size() - 1; w2 <= dialength / 2; j--){ c2 = diapath[j]; if(j+1 < diaedges.size()) w2 += diapath[j+1]; } if(w1 > w2) c = c2; else c = c1; } if(dialength > maxdia){ bigcenter = c; maxdia = dialength; } centers.push_back(c); } } for(ll i : centers){ if(i != bigcenter){ adj[i].push_back({bigcenter, L}); adj[bigcenter].push_back({i, L}); } } vis.assign(N, false); diameter(0, N); for(ll i : diaedges) ret += i; return ret; }
#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...