Submission #1184418

#TimeUsernameProblemLanguageResultExecution timeMemory
1184418ivazivaDreaming (IOI13_dreaming)C++20
100 / 100
81 ms21000 KiB
#include <bits/stdc++.h> #include "dreaming.h" using namespace std; #define MAXN 100001 long long brkomp=0,timer=1,slucaj=0; vector<pair<long long,long long>> adj[MAXN]; long long komponenta[MAXN],dist[MAXN],broj[MAXN]; vector<long long> nodes[MAXN]; vector<long long> answers; void dfs(long long node,long long pret) { komponenta[node]=brkomp;nodes[brkomp].push_back(node); for (pair<long long,long long> par:adj[node]) { int sled=par.first,w=par.second;if (sled==pret) continue; dist[sled]=dist[node]+w;dfs(sled,node); } } void dfs1(long long node,long long pret) { for (pair<long long,long long> par:adj[node]) { int sled=par.first,w=par.second;if (sled==pret) continue; dist[sled]=dist[node]+w;dfs1(sled,node); } } void dfs2(long long node,long long pret,long long val) { if (dist[node]==val) broj[node]=1; for (pair<long long,long long> par:adj[node]) { long long sled=par.first,w=par.second;if (sled==pret) continue; dfs2(sled,node,val);broj[node]+=broj[sled]; } } void resi(long long komp) { long long maxdist=0,maxnode=nodes[komp][0]; for (long long node:nodes[komp]) { if (dist[node]>maxdist) {maxdist=dist[node];maxnode=node;} } dist[maxnode]=0;dfs1(maxnode,0);long long len=0; for (long long node:nodes[komp]) len=max(len,dist[node]); slucaj=max(slucaj,len);long long sol=len;dfs2(maxnode,0,len); for (int node:nodes[komp]) { if (broj[node]!=0) sol=min(sol,max(dist[node],len-dist[node])); } answers.push_back(sol); } int travelTime(int n,int m,int l,int a[],int b[],int t[]) { for (long long i=0;i<m;i++) {long long node1=a[i]+1,node2=b[i]+1,weight=t[i];adj[node1].push_back({node2,weight});adj[node2].push_back({node1,weight});} for (long long node=1;node<=n;node++) { if (komponenta[node]==0) {brkomp++;dfs(node,0);} } for (long long komp=1;komp<=brkomp;komp++) resi(komp); sort(answers.begin(),answers.end());reverse(answers.begin(),answers.end());long long ans=slucaj; if (answers.size()==1) ans=max(ans,answers[0]); if (answers.size()>=2) ans=max(ans,answers[0]+answers[1]+l); if (answers.size()>=3) ans=max(ans,answers[1]+answers[2]+2*l); return 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...