Submission #740295

#TimeUsernameProblemLanguageResultExecution timeMemory
740295NeltDreaming (IOI13_dreaming)C++17
100 / 100
134 ms20156 KiB
#pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx,avx2,fma") #include "dreaming.h" #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> /* DEFINES */ #define S second #define F first #define ll long long #define ull unsigned long long #define ld long double #define npos ULLONG_MAX #define INF LLONG_MAX #define vv(a) vector<a> #define pp(a, b) pair<a, b> #define pq(a) priority_queue<a> #define qq(a) queue<a> #define ss(a) set<a> #define mm(a, b) map<a, b> #define ump(a, b) unordered_map<a, b> #define sync \ ios_base::sync_with_stdio(0); \ cin.tie(0); \ cout.tie(0); #define elif else if #define endl "\n" #define allc(a) begin(a), end(a) #define all(a) a, a + sizeof(a) / sizeof(a[0]) #define pb push_back #define logi(a) __lg(a) #define sqrt(a) sqrtl(a) #define mpr make_pair #define ins insert using namespace std; using namespace __gnu_pbds; using namespace __cxx11; typedef char chr; typedef basic_string<chr> str; template <typename T, typename key = less<T>> using ordered_set = tree<T, null_type, key, rb_tree_tag, tree_order_statistics_node_update>; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); const ll N = 1e5 + 5; vv(pp(ll, ll)) g[N]; ll depth[3][N]; bool used[N]; vv(ll) comp; void dfs(ll v, ll t) { used[v] = 1; if (!t) comp.pb(v); for (auto [to, w] : g[v]) if (!used[to]) depth[t][to] = depth[t][v] + w, dfs(to, t); } int travelTime(int n, int m, int cost, int A[], int B[], int C[]) { for (ll i = 0; i < m; i++) A[i]++, B[i]++, g[A[i]].pb(mpr(B[i], C[i])), g[B[i]].pb(mpr(A[i], C[i])); ll a, b; multiset<ll> s; ll ans = 0; for (ll i = 1; i <= n; i++) if (!used[i]) { comp.clear(); dfs(i, 0); a = i; for (ll j : comp) if (depth[0][j] > depth[0][a]) a = j; for (ll j : comp) used[j] = 0; dfs(a, 1); b = a; for (ll j : comp) if (depth[1][j] > depth[1][b]) b = j; for (ll j : comp) used[j] = 0; dfs(b, 2); ans = max(ans, depth[1][b]); ll mn = INF; for (ll j : comp) mn = min(mn, max(depth[1][j], depth[2][j])); s.ins(mn); // cout << mn << " "; } while (s.size() > 1) { ll x = *s.begin(), y = *s.rbegin(); s.erase(s.begin()); s.erase(--s.end()); ans = max(ans, y + cost + x); s.ins(max(x + cost, y)); } return max(*s.begin(), ans); }
#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...