Submission #67997

#TimeUsernameProblemLanguageResultExecution timeMemory
67997KieranHorganRace (IOI11_race)C++17
21 / 100
3060 ms110620 KiB
#include "race.h"
#include <bits/stdc++.h>
using namespace std;

vector<pair<int, int>> AdjList[200000];
bitset<200000> visited1[100];
bitset<200000> visited2[100];
int prv[100][200000];

int best_path(int N, int K, int H[][2], int L[]) {
	for(int i = 0; i+1 < N; i++) {
		AdjList[H[i][0]].push_back({L[i], H[i][1]});
		AdjList[H[i][1]].push_back({L[i], H[i][0]});
	}

	queue<pair<pair<int, int>, pair<pair<int, int>, int>>> q;
	for(int i = 0; i < N; i++)
		q.push({{i, -1}, {{0, 0}, -1}});
	int u, p, d, s, to;
	while(!q.empty()) {
		u = q.front().first.first;
		p = q.front().first.second;
		d = q.front().second.first.first;
		s = q.front().second.first.second;
		to = q.front().second.second;
		q.pop();
		for(auto v: AdjList[u]) {
			if(v.second != p && (to == -1 || to == v.second)) {
				if(d+v.first == K)
					return s+1;
				if(d+v.first > K) continue;
				if(K <= 100) {
					if(!visited1[d+v.first][v.second]) {
						visited1[d+v.first][v.second]=1;
						q.push({{v.second, u}, {{d+v.first, s+1}, -1}});
						prv[d+v.first][v.second] = u;
					} else if(!visited2[d+v.first][v.second] && prv[d+v.first][v.second] != u) {
						visited2[d+v.first][v.second]=1;
						q.push({{v.second, u}, {{d+v.first, s+1}, prv[d+v.first][v.second]}});
					}
				} else {
					q.push({{v.second, u}, {{d+v.first, s+1}, -1}});
				}
			}
		}
	}

	return -1;
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...