Submission #336015

# Submission time Handle Problem Language Result Execution time Memory
336015 2020-12-14T13:34:12 Z wind_reaper Dreaming (IOI13_dreaming) C++17
0 / 100
1000 ms 8608 KB
#include "dreaming.h"
#include <bits/stdc++.h>

using namespace std; 

vector<vector<pair<int, int>>> adj; 
vector<int> vis, vis2, father, father_dis; 
vector<int> components; 
void new_comp(int node, int c, int N){
	vis2.assign(N, 0); 
	father.assign(N, -1); 
	father_dis.assign(N, 0); 
	queue<pair<int, int64_t>> q;

	q.push({node, 0}); 

	vector<int64_t> dis(N, 0); 
	int r = 0; 
	while(!q.empty()){
		pair<int, int> cur = q.front(); 
		q.pop(); 
		r++; 
		vis[cur.first] = 1; 
		dis[cur.first] = int64_t(cur.second); 
		for(pair<int, int> e : adj[cur.first]){
			if(!vis[e.first])
				q.push({e.first, int64_t(cur.second + e.second)}); 
		}
	}

	if(r == 1){
		components.push_back(0);
		return; 
	}

	int end = max_element(dis.begin(), dis.end()) - dis.begin(); 
	dis.assign(N, 0); 

	q.push({end, 0}); 

	while(!q.empty()){
		pair<int, int> cur = q.front(); 
		q.pop(); 
		vis2[cur.first] = 1; 
		dis[cur.first] = cur.second; 
		for(pair<int, int> e : adj[cur.first]){
			if(!vis2[e.first]){
				father[e.first] = cur.first;
				father_dis[e.first] = e.second; 
				q.push({e.first, int64_t(cur.second + e.second)}); 
			}
		}
	}

	auto it = max_element(dis.begin(), dis.end()); 
	end = it - dis.begin();
	int pops = father[end]; 
	int64_t cur_dis = LLONG_MAX; 
	int64_t travel = 0; 
	while(pops != -1){
		travel += int64_t(father_dis[end]); 
		cur_dis = min(cur_dis, max(travel, *it - travel)); 
		end = pops;
		pops = father[end];  
	}
	components.push_back(cur_dis); 
}
int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
    adj.resize(N);
    vis.resize(N);  
    for(int i = 0; i < M; i++){
    	adj[A[i]].push_back({B[i], T[i]});
    	adj[B[i]].push_back({A[i], T[i]}); 
    }

    int c = 0; 
    for(int i = 0; i < N; i++)
    	if(!vis[i])
    		new_comp(i, c++, N);
    
    sort(components.rbegin(), components.rend()); 
    if(c == 1)
    	return components[0]; 
    if(c == 2)
    	return components[0] + components[1] + L; 
    return max(components[0] + components[1] + L, components[1] + components[2] + 2*L); 
}
# Verdict Execution time Memory Grader output
1 Incorrect 53 ms 8608 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 53 ms 8608 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 53 ms 8608 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 1085 ms 7204 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 53 ms 8608 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 53 ms 8608 KB Output isn't correct
2 Halted 0 ms 0 KB -