제출 #926909

#제출 시각아이디문제언어결과실행 시간메모리
926909Wansur사이버랜드 (APIO23_cyberland)C++17
97 / 100
885 ms100216 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,64);
		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;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});
			}
		}
		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;
					s.push({To.f,x+1,d[To.f][x+1]});
				}
			}
		}
		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...