Submission #1340609

#TimeUsernameProblemLanguageResultExecution timeMemory
1340609axtelnVoting Cities (NOI22_votingcity)C++20
20 / 100
711 ms972 KiB
#include <bits/stdc++.h>
#define fastio cin.tie(0)->sync_with_stdio(0)
using namespace std;
using ll = long long;
using pii = pair<ll,ll>;
using db = long double;

unordered_set<int> res;
vector<vector<pii>> graph(5001);
vector<int> ti;
int n,m,k;
const int po = 1<<5;

struct State{
	ll cur,w,tickets;
	//vector<ll> path;
	
	bool operator<(const State& o) const{
		return tie(w,cur,tickets)>tie(o.w,o.cur,o.tickets);
	}
};

ll dijkstra(int st,int tttt){
	vector<ll> dis(n+1,4e18);
	dis[st]=0;
	priority_queue<State> pq;
	pq.push({st,0,tttt});
	while (!pq.empty()){
		State t=pq.top();pq.pop();
		ll cur=t.cur,w=t.w;
		int tickets=t.tickets;
		/*
		if (res.count(cur)){
			sort(t.path.begin(),t.path.end(),greater<ll>());
			ll temp=w;
			vector<bool> vis(5,0);
			
			for (int i:t.path){
				cout << i << " ";
			}cout << '\n';
			
			for (int i=0;i<5;i++){
				if (i==t.path.size()) break;
				for (int j=4;j>=0;j--){
					if (vis[j]==1) continue;
					if (!((tickets>>j)&1)) continue;
					if (ti[j]!=-1 && ((t.path[i]/10)*(j+1)) > ti[j]){
						temp-=((t.path[i]/10)*(j+1));
						temp+=ti[j];vis[j]=1;
						break;
					}
				}
			}
			//cout << dis[cur] << " " << temp << '\n';
			dis[cur]=min(dis[cur],temp);
		}
		*/
		//cout << cur << " " << w << " " << tickets << "\n";
		if (w > dis[cur]) continue;
		
		for (pii i:graph[cur]){
			for (int j=-1;j<5;j++){
				if (j==-1){
					ll nx=i.first,nw=i.second;
					if (dis[nx] < nw+w) continue;
					dis[nx]=nw+w;
					
					pq.push({nx,dis[nx],tickets});
				}
				else if (ti[j]!=-1 && (tickets>>j)&1){
					ll nx=i.first,nw=i.second;
					if (dis[nx] < (nw/10*(10-j-1))+w+ti[j]) continue;
					dis[nx]=(nw/10*(10-j-1))+w+ti[j];
					int ert=tickets;
					ert-=(1<<j);
					
					pq.push({nx,dis[nx],ert});
				}
			}
		}
	}
	ll mn=4e18;
	for (int i:res){
		mn=min(mn,dis[i]);
	}return mn;
}

int main(){
	fastio;
	cin >> n >> m >> k;
	for (int i=0;i<k;i++){
		int a;cin >> a;
		res.insert(a);
	}
	for (int i=0;i<m;i++){
		int st,en;ll c;
		cin >> st >> en >> c;
		graph[st].push_back({en,c});
		//graph[en].push_back({st,c});
	}
	int q;cin >> q;
	for (int i=0;i<q;i++){
		int st,p1,p2,p3,p4,p5;
		cin >> st >> p1 >> p2 >> p3 >> p4 >> p5;
		
		int mask=((p1!=-1)<<4)+((p2!=-1)<<3)+((p3!=-1)<<2)+((p4!=-1)<<1)+((p5!=-1)<<0);
		
		ti={p1,p2,p3,p4,p5};
		ll ans=4e18;
		
		for (int i=0;i<po;i++){
			bool yes=1;
			for (int j=0;j<5;j++){
				if ((i>>j)&1 && ti[j]==-1)yes=0;
			}
			if (yes)ans=min(ans,dijkstra(st,i));
		}
		
		if (ans!=4e18)cout << ans << "\n";
		else cout << -1 << "\n";
	}
	return 0;
}
#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...