Submission #926910

#TimeUsernameProblemLanguageResultExecution timeMemory
926910WansurCyberland (APIO23_cyberland)C++17
100 / 100
1183 ms100180 KiB
#include <bits/stdc++.h>
#define f first
#define s second
#define ent '\n'
  
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#pragma GCC optimize("Ofast,unroll-loops,fast-math,O3")
 
using namespace std;
typedef long long ll;
const int mx=1e5+12;
 
vector<pair<int,int>> g[mx];
double d[mx][101];
bool was[mx][101];
bool used[mx];
 
struct node{
	int v,x;
	double w;
	friend bool operator <(node a,node b){
        return a.w > b.w;
    }
};
 
void dfs(int v){
	used[v]=1;
	for(auto to:g[v]){
		if(!used[to.f]){
			dfs(to.f);
		}
	}
}
 
double solve(int n, int m, int k, int h, vector<int> x, vector<int> y, vector<int> c, vector<int> arr){
	k=min(k,67);
	for(int i=0;i<n;i++){
		g[i].clear();
		used[i]=0;
	}
	for(int i=0;i<m;i++){
		g[x[i]].push_back({y[i],c[i]});
		g[y[i]].push_back({x[i],c[i]});
	}
	dfs(0);
	if(!used[h]){
		return -1;
	}
	for(int i=0;i<n;i++){
		for(int x=0;x<=k+1;x++){
			d[i][x]=1e18;
			was[i][x]=0;
		}
		used[i]=0;
	}
	used[h]=1;
	dfs(0);
	priority_queue<node> s;
	d[0][0]=0;
	s.push({0,0,0});
	for(int i=0;i<n;i++){
		if(used[i] && arr[i]==0){
			d[i][0]=0;
			s.push({i,0,0});
		}
	}
	vector<pair<int,int>> q;
	for(int x=0;x<=k;x++){
		while(s.size()){
			int v=s.top().v,x=s.top().x;
			double w=s.top().w;
			s.pop();
			if(v==h)continue;
			if(w>d[v][x]){
				continue;
			}
			for(const auto &To:g[v]){
				if(d[To.f][x]>d[v][x]+To.s){
					d[To.f][x]=d[v][x]+To.s;
					s.push({To.f,x,d[To.f][x]});
				}
				if(x<k && d[To.f][x+1]>d[v][x]/2+To.s && arr[v]==2){
					d[To.f][x+1]=d[v][x]/2+To.s;
					q.push_back({To.f,x+1});
				}
			}
		}
		for(auto x:q){
			if(was[x.f][x.s])continue;
			was[x.f][x.s]=1;
			s.push({x.f,x.s,d[x.f][x.s]});
		}
	}
	double ans=1e18;
	for(int x=k;x>=0;x--){
		if(d[h][x]>=1e18)continue;
		ans=min(ans,d[h][x]);
		if(arr[h]==2 && x>0 && d[h][x-1]<2e14)ans=min(ans,d[h][x-1]/(double)2.0);
	}
	return ans;
}
#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...