Submission #1146558

#TimeUsernameProblemLanguageResultExecution timeMemory
1146558zhasynDreaming (IOI13_dreaming)C++20
18 / 100
1093 ms11764 KiB
#include "dreaming.h" #include <bits/stdc++.h> #define pb push_back #define pf push_front using namespace std; #define F first #define S second typedef long long ll; #define pii pair <int, int> #define pll pair <ll, ll> typedef long double ld; const ll N = 1e5 + 100, M = 4096 + 10, len = 21, inf = 1e18; const ll mod = 1e9 + 7; vector <pii> q[N]; int cur[N], ans, put[N]; bool was[N]; int dfs1(int v, int pred){ was[v] = true; int mx1 = 0, mx2 = 0; for(auto u : q[v]){ if(u.F == pred) continue; int rs = dfs1(u.F, v) + u.S; if(rs > mx1){ mx2 = mx1; mx1 = rs; } else mx2 = max(mx2, rs); put[v] = max(put[v], rs); } //ans = max(ans, mx1 + mx2); return put[v]; } void dfs3(int v, int pred, int sum){ ans = max(ans, sum); for(auto u : q[v]){ if(u.F == pred) continue; dfs3(u.F, v, sum + u.S); } } int dfs2(int v, int pred){ pii u; set <pii> st; st.insert({0, -1}); for(int i = 0; i < (int)q[v].size(); i++){ u = q[v][i]; st.insert({put[u.F] + u.S, u.F}); } for(int i = 0; i < (int)q[v].size(); i++){ u = q[v][i]; if(u.F == pred) continue; st.erase({put[u.F] + u.S, u.F}); pii mx = *st.rbegin(); if(put[u.F] > mx.F + u.S){ put[v] = mx.F; return dfs2(u.F, v); } st.insert({put[u.F] + u.S, u.F}); } return st.rbegin()->F; } int travelTime(int n, int m, int l, int a[], int b[], int t[]) { for(int i = 0; i < m; i++){ q[a[i]].pb({b[i], t[i]}); q[b[i]].pb({a[i], t[i]}); } vector <int> vec; for(int i = 0; i < n; i++){ dfs3(i, -1, 0); if(was[i]) continue; dfs1(i, -1); int mn = dfs2(i, -1); vec.pb(mn); //cout << i << " "<< mn << endl; //cout << "NEW ONE\n\n"; } sort(vec.begin(), vec.end()); int ss = (int)vec.size(); if((int)vec.size() >= 2) ans = max(ans, vec[ss - 1] + vec[ss - 2] + l); if((int)vec.size() >= 3) ans = max(ans, vec[ss - 3] + vec[ss - 2] + 2 * l); return ans; } // int main() { // ios::sync_with_stdio(false); // cin.tie(NULL); // int n, m, l; // cin >> n >> m >> l; // int a[m], b[m], x[m]; // for(int i = 0; i < m; i++){ // cin >> a[i] >> b[i] >> x[i]; // } // cout << travelTime(n, m, l, a, b, x); // return 0; // }
#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...