Submission #610924

#TimeUsernameProblemLanguageResultExecution timeMemory
610924beedleDreaming (IOI13_dreaming)C++17
100 / 100
99 ms22348 KiB
#include "dreaming.h" #include <iostream> #include <iomanip> #include <vector> #include <algorithm> #include <set> #include <iterator> #include <stack> #include <map> #include <math.h> #include <bitset> #include <deque> #include <string> #include <tuple> #include <queue> #include <numeric> #include <unordered_set> #include <unordered_map> #define pi 3.141592653589793238 #define ll long long #define ld long double #define rep(i, a, b) for (long long i = a; i <= b; i++) #define mod 998244353ll #define INF 1000000000000000000 #define pb push_back #define ff first #define ss second #define endl '\n' #define all(x) (x).begin (), (x).end () #define sz(x) (ll) (x).size () #define reunique(v) v.resize(std::unique(v.begin(), v.end()) - v.begin()) #define rank rnk #define log lg #define fast \ ios_base::sync_with_stdio (false); \ cin.tie (NULL); \ cout.tie (NULL) using namespace std; ll maxdist; ll maxvertex; void dfs(int v, int p, vector <pair<ll,ll>> adj[], vector <bool> &marked, vector <ll> &d, vector <pair<ll,ll>> &par) { marked[v]=true; if(p==-1) { d[v]=0; maxdist=0; maxvertex=v; } else { if(d[v]>maxdist) { maxdist=d[v]; maxvertex=v; } } for(auto u:adj[v]) if(u.ff!=p) { d[u.ff]=u.ss+d[v]; par[u.ff]={v,u.ss}; dfs(u.ff,v,adj,marked,d,par); } } int travelTime(int n, int m, int l, int a[], int b[], int t[]) { vector <pair<ll,ll>> adj[n+1]; vector <bool> marked(n+1); vector <ll> d(n+1); vector <pair<ll,ll>> p(n+1); rep(i,0,m-1) { adj[a[i]].pb({b[i],t[i]}); adj[b[i]].pb({a[i],t[i]}); } vector <ll> w; ll g=0; rep(i,0,n-1) if(!marked[i]) { dfs(i,-1,adj,marked,d,p); ll e1=maxvertex; dfs(e1,-1,adj,marked,d,p); ll e2=maxvertex; // cout<<e1<<" "<<e2<<" "<<maxdist<<endl; g=max(maxdist,g); if(e1==e2) { w.pb(0); continue; } ll v=e2; ll dnow=0; while(true) { ll last=dnow; dnow+=p[v].ss; v=p[v].ff; if(2*dnow>=maxdist) { w.pb(min(dnow,maxdist-last)); break; } } } // for(auto x:w) // cout<<x<<" "; // cout<<endl; if(sz(w)==1) return g; else if(sz(w)==2) return max(g,w[0]+w[1]+l); else { sort(all(w)); reverse(all(w)); return max({w[0]+w[1]+l,w[1]+w[2]+2*l,g}); } } // signed main() // { // int n=12; // int m=8; // int l=2; // int a[]={0,8,2,5,5,1,1,10}; // int b[]={8,2,7,11,1,3,9,6}; // int t[]={4,2,4,3,7,1,5,3}; // cout<<travelTime(n,m,l,a,b,t); // 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...