Submission #1272385

#TimeUsernameProblemLanguageResultExecution timeMemory
1272385burnthememoryVoting Cities (NOI22_votingcity)C++20
100 / 100
71 ms8732 KiB

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
#define pb push_back
#define mp make_pair
#define fi first
#define se second
 
const ll N = 5000+10;
vector<vector<ll>> dis(N, vector<ll> ((1<<5), 1e18));
vector<vector<pair<ll, ll>>> adj(N);

void solve() {
	ll n, e, k; cin >> n >> e >> k;
	ll t[n]; 
	
	for(int i = 0; i < k; i++){
		cin >> t[i];
		adj[n].pb(mp(t[i], 0));
	}
	dis[n][0] = 0;
	
	for(int i = 0; i < e; i++){
		ll u, v, w; cin >> u >> v >> w;
		adj[v].pb(mp(u, w));
	}
	
	priority_queue<pair<ll, pair<ll, ll>>> pq;
	pq.push(mp(0, mp(n, 0)));
	while(!pq.empty()){
		auto cur = pq.top();
		ll u = cur.se.fi, id = cur.se.se, diz = cur.fi*-1;
		pq.pop();
		if(diz > dis[u][id]){
			continue;
		}
//		cout << u << " " << id << " " << diz << endl;
		
		for(auto next : adj[u]){
			ll v = next.fi, len = next.se;
			ll newd = diz + len;
			if(newd < dis[v][ id ]){
				dis[v][id] = newd;
				pq.push(mp(newd*-1, mp(v, id) )); 
			}
			
			if(u==n) continue;
			
			for(int bit = 0; bit < 5; bit ++){
				if(id & (1<<bit)) continue;
				ll newdis = diz + len-((len * (bit+1))/10);
				
				if(newdis < dis[v][ (id^(1<<bit)) ]){
					dis[v][ (id^(1<<bit)) ] = newdis;
					pq.push(mp(newdis*-1, mp(v, (id^(1<<bit))) )); 
				}
				
				
//			cout <<  " " << v << " " << (id^(1<<bit)) << " " << len << " " << ((len * (bit+1))/10) << endl;
			}
		}
	}
	
	
	ll query; cin >> query;
	while(query--){
		ll u; cin >> u;
		ll p[5]; 
		for(int i = 0; i < 5;  i++) cin >> p[i];
		
		ll ans = 1e18;
		for(int j = 0; j < (1<<5); j ++){
			ll ok = 1, cur = dis[u][j];
			for(int bit = 0; bit < 5; bit++){
				if(!(j & (1 << bit))) continue; 
				if(p[bit] == -1) ok = 0;
				cur += p[bit];
			}
			if(!ok) continue; 
			ans = min(ans, cur);
//			cout << " " << ans << " " << cur << " " << j << endl;
		}
		
		cout << (ans == 1e18 ? -1 : ans) << endl;
		
		
	}
	
	
	
	
	
}

int main(){
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  ll t=1; 
//  cin >> t;
  while(t--) solve();
}

//
#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...