Submission #759650

#TimeUsernameProblemLanguageResultExecution timeMemory
759650IvanJCyberland (APIO23_cyberland)C++17
100 / 100
2452 ms20656 KiB
#include "cyberland.h"
#include<bits/stdc++.h>

#define pb push_back
#define x first
#define y second
#define all(a) (a).begin(), (a).end()

using namespace std;

typedef long long ll;
typedef pair<int, int> ii;

const int maxn = 1e5 + 5;
const double inf = 1e18;
double dist[maxn], dist1[maxn];
vector<ii> adj[maxn];
int vis[maxn], change[maxn];
int X;

void reach(int x) {
	if(vis[x] || x == X) return;
	vis[x] = 1;
	for(auto p : adj[x]) 
		reach(p.x);
}

double solve(int N, int M, int K, int H, vector<int> u, vector<int> v, vector<int> c, vector<int> arr) {
	for(int i = 0;i < N;i++) {
		adj[i].clear();
		vis[i] = 0;
		dist[i] = inf;
	}
	
	for(int i = 0;i < M;i++) 
		adj[u[i]].pb({v[i], c[i]}), adj[v[i]].pb({u[i], c[i]});
	
	X = H;
	reach(0);
	for(int i = 0;i < N;i++) 
		if(arr[i] == 0 && vis[i] == 1) dist[i] = 0;
	dist[0] = 0;
	
	for(int k = 0;k <= K;k++) {
		set<pair<double, int>> s;
		for(int i = 0;i < N;i++) {
			change[i] = 0;
			dist1[i] = dist[i];
			if(vis[i] == 1) s.insert({dist[i], i});
		}
		
		int flag = 0;
		while(s.size()) {
			auto state = *s.begin();
			s.erase(state);
			int x = state.y;
			if(x == H) continue;
			
			for(auto p : adj[x]) {
				int y = p.x;
				double cost = p.y;
				
				if(arr[y] == 1) {
					if(dist1[x] + cost < dist1[y]) {
						s.erase({dist1[y], y});
						dist1[y] = dist1[x] + cost;
						dist[y] = dist1[y], flag = 1;
						s.insert({dist1[y], y});
					}
				} 
				if(arr[y] == 2) {
					if(dist1[x] + cost < dist1[y]) {
						s.erase({dist1[y], y});
						dist1[y] = dist1[x] + cost;
						s.insert({dist1[y], y});
					}
					if((dist1[x] + cost) / 2.0 < dist[y]) 
						dist[y] = (dist1[x] + cost) / 2.0, flag = 1;
				}
			}
		}
		if(flag == 0) break;
	}
	
	if(dist[H] == inf) return -1;
	return dist[H]; 
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...