Submission #1273589

#TimeUsernameProblemLanguageResultExecution timeMemory
1273589ahmd_ibraaaVoting Cities (NOI22_votingcity)C++20
100 / 100
62 ms5268 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define fi first
#define sec second

signed main(){
	int N,E,K;
	cin>>N>>E>>K;
	int vc[K+1];
	int dis[N+1][32];
	vector<pair<int,int>> adj[N+1];
	for(int i=1; i<=K; i++){
		cin>>vc[i];
	}
	for(int i=0; i<N; i++){
		for(int j=0; j<=31; j++){
			dis[i][j] = 1e18;
		}
	}
	
	for(int i=1; i<=E; i++){
		int u,v,c;
		cin>>u>>v>>c;
		adj[v].push_back({u,c});
	}
	priority_queue<pair<int,pair<int,int>>, vector<pair<int,pair<int,int>>>, greater<pair<int,pair<int,int>>>> pq;
	for(int i=1; i<=K; i++){
		dis[vc[i]][0] = 0;
		pq.push({0, {vc[i], 0}});
		for(int j=0; j<32; j++) dis[vc[i]][j] = 0;
	}
	
	while(!pq.empty()){
		auto now = pq.top();
		pq.pop();
		if(now.fi > dis[now.sec.fi][now.sec.sec]) continue;
		for(auto itr:adj[now.sec.fi]){
			if(dis[itr.fi][now.sec.sec]>(now.fi+itr.sec)){
				dis[itr.fi][now.sec.sec] = now.fi+itr.sec;
				pq.push({dis[itr.fi][now.sec.sec], {itr.fi, now.sec.sec}});
			}
			
			for(int i=0; i<5; i++){
				if((now.sec.sec & (1<<i))!=0) continue;
				int disNext = now.fi + itr.sec*(10 - i - 1)/10;
				int maskNext = now.sec.sec | (1<<i);
				if(dis[itr.fi][maskNext] > disNext){
					dis[itr.fi][maskNext] = disNext;
					pq.push({disNext, {itr.fi, maskNext}});
				}
			}
		}
	}
	
	int Q; cin>>Q;
	while(Q--){
		int s, p[5];
		cin>>s;
		int ptotal = 0;
		for(int i=0; i<5; i++){
			cin>>p[i];
			if(p[i]!=-1) ptotal|=(1<<i);
		}
		int ans = 1e18;
		for(int m=0; m<32; m++){
			int curAns = dis[s][m];
			if(dis[s][m]!=1e18 && (ptotal&m)==m){
				for(int i=0; i<5; i++){
					if((m & (1<<i))) curAns += p[i];
				}
				ans = min(ans, curAns);
			}
		}
		if(ans>=1e18) cout<<-1<<endl;
		else cout<<ans<<endl;
	}
}
#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...