Submission #1362441

#TimeUsernameProblemLanguageResultExecution timeMemory
1362441nguyenkhangninh99Cyberland (APIO23_cyberland)C++20
100 / 100
99 ms69064 KiB
#include <bits/stdc++.h>
#include "cyberland.h"

using namespace std;
const int maxn = 1e5 + 5;
int p[maxn];
int find(int u){
    return (p[u] == u ? u : p[u] = find(p[u]));
}
bool minimize(double &a, double b){
    if(a > b){
        a = b;
        return true;
    }return false;
};
double solve(int n, int m, int k, int h, vector<int> x, vector<int> y, vector<int> c, vector<int> a){
	vector<vector<array<int, 2>>> g(n);
    for(int i = 0; i < n; i++) p[i] = i;
	for(int i = 0; i < m; i++){
		if(x[i] != h && y[i] != h) p[find(x[i])] = find(y[i]);
		g[x[i]].push_back({y[i], c[i]});
		g[y[i]].push_back({x[i], c[i]});
	}

    k = min(k, 69);
	vector<double> pwr(k + 1, 1);
	for(int i = 1; i <= k; i++) pwr[i] = pwr[i - 1] / 2;

	vector<vector<double>> dist(n, vector<double>(k + 1, 1e18));
	priority_queue<tuple<double, int, int>, vector<tuple<double, int, int>>, greater<tuple<double, int, int>>> pq;
    dist[h][k] = a[0] = 0;
    pq.push({0, h, k});
	while(pq.size()){
		auto [d, u, j] = pq.top();
		pq.pop();
		if(dist[u][j] < d) continue;
		if(a[u] == 0) return d;
		for(auto [v, w]: g[u]){
			if(find(v) != find(0)) continue;
            if(minimize(dist[v][j], d + w * pwr[k - j])) pq.push({dist[v][j], v, j});
			if(a[u] == 2 && j) if(minimize(dist[v][j - 1], d + w * pwr[k - j + 1])) pq.push({dist[v][j - 1], v, j - 1});
		}
	}
	return -1;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...