Submission #1194223

#TimeUsernameProblemLanguageResultExecution timeMemory
1194223PlayVoltzDreaming (IOI13_dreaming)C++20
100 / 100
97 ms20292 KiB
#include "dreaming.h"
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define pii pair<int, int>
#define mp make_pair
#define pb push_back

int n, m, l, counter=0;
vector<vector<pii> > graph;
vector<vector<int> > comp;
vector<int> dist, dsu, in, out;
vector<bool> visited;

int fp(int node){
	if (dsu[node]==node)return node;
	return dsu[node]=fp(dsu[node]);
}

void merge(int a, int b){
	int pa=fp(a), pb=fp(b);
	dsu[pa]=pb;
}

void dfs(int node, int par, int d){
	visited[node]=1;
	in[node]=++counter;
	dist[node]=d;
	for (auto num:graph[node])if (num.first!=par)dfs(num.first, node, d+num.second);
	out[node]=counter;
}

bool ispar(int a, int b){
	return in[a]<=in[b] && out[a]>=in[b];
}

pii dialen(int node){
	pii res;
	dfs(node, -1, 0);
	int mx=-1, dia1, dia2;
	for (auto i:comp[fp(node)]){
		if (dist[i]>mx){
			mx=dist[i];
			dia1=i;
		}
	}
	dfs(dia1, -1, 0);
	res.first=-1;
	for (auto i:comp[fp(dia1)]){
		if (dist[i]>res.first){
			res.first=dist[i];
			dia2=i;
		}
	}
	res.second=LLONG_MAX;
	queue<int> q;
	q.push(dia1);
	int trav=0, left=res.first;
	while (!q.empty()){
		int cnode=q.front();
		q.pop();
		res.second=min(res.second, max(trav, left));
		for (auto num:graph[cnode]){
			if (ispar(cnode, num.first)&&ispar(num.first, dia2)){
				q.push(num.first);
				trav+=num.second;
				left-=num.second;
			}
		}
	}
	return res;
}

signed travelTime(signed N, signed M, signed L, signed A[], signed B[], signed T[]){
	n=N, m=M, l=L;
	graph.resize(n);
	visited.resize(n, 0);
	dsu.resize(n, -1);
	in.resize(n);
	out.resize(n);
	dist.resize(n);
	comp.resize(n);
	for (int i=0; i<n; ++i)dsu[i]=i;
	for (int i=0; i<m; ++i){
		graph[A[i]].pb(mp(B[i], T[i]));
		graph[B[i]].pb(mp(A[i], T[i]));
		merge(A[i], B[i]);
	}
	for (int i=0; i<n; ++i)comp[fp(i)].pb(i);
	if (m==n-1)return dialen(0).first;
	vector<int> vals, dia;
	for (int i=0; i<n; ++i){
		if (!visited[i]){
			pii res = dialen(i);
			dia.pb(res.first);
			vals.pb(res.second);
		}
	}
	sort(dia.begin(), dia.end(), greater<int>());
	sort(vals.begin(), vals.end(), greater<int>());
	if (m==n-2)return max(dia[0], vals[0]+vals[1]+l);
	return max(dia[0], max(vals[0]+vals[1]+l, vals[1]+vals[2]+2*l));
}
#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...