Submission #1157768

#TimeUsernameProblemLanguageResultExecution timeMemory
1157768dibamboo23Escape Route (JOI21_escape_route)C++20
5 / 100
9085 ms135632 KiB
#include "escape_route.h"
#include <bits/stdc++.h>

#pragma GCC optimize ("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")


#define ll long long
#define sz size()
#define F first
#define S second

using namespace std;

const int N=1e6+3;
const ll inf=1e18;

ll start[N];// when security inspection start on edge
ll len[N];// length of edge
vector<pair<int,int>>g[N];// our graph [vertex , index of edge]
int n;// number of vertex
ll day;

void add_edge(int A,int B,int id){
	g[A].push_back({B,id});
	g[B].push_back({A,id});
}

ll calc(int s,int f,ll t){
	vector<ll>p(n+3,inf);
	p[s]=t;
	set<pair<ll,int>>st;
	st.insert({p[s],s});
	while(!st.empty()){
		int v=st.begin()->S;
		st.erase(st.begin());
		for(auto [to,i]:g[v]){
			ll val=inf;
			if((p[v]%day)+len[i]<=start[i])val=p[v]+len[i];
			else val=(p[v]/day+1)*day+len[i];
			if(p[to]>val){
				st.erase({p[to],to});
				p[to]=val;
				st.insert({p[to],to});
			}
		}
	}
	// for(int i=0;i<n;i++)cout<<p[i]<<" ";
	// cout<<"\n";
	return p[f]-t;
}

std::vector<long long> calculate_necessary_time(
    signed N, signed M, long long S, signed Q, std::vector<signed> A, std::vector<signed> B,
    std::vector<long long> L, std::vector<long long> C, std::vector<signed> U,
    std::vector<signed> V, std::vector<long long> T)
{
	ios_base::sync_with_stdio(0);cin.tie(0);
	day=S;
	n=N;
	// cout<<day<<" "<<n<<"\n";
	int m=M,q=Q;
	vector<ll>ans;
	for(int i=0;i<m;i++){
		// cout<<A[i]<<" "<<B[i]<<" "<<i<<"\n"; 
		add_edge(A[i],B[i],i);
		start[i]=C[i];
		len[i]=L[i];
	}
	// for(int i=0;i<n;i++){
		// for(auto [to,ii]:g[i])cout<<i<<"-"<<to<<" "<<ii<<"\n";
	// }
	for(int i=0;i<q;i++){
		ans.push_back(calc(U[i],V[i],T[i]));
	}
	return ans;
}

// signed main(){
	// int N,M;ll S;int Q;
	// vector<int>A(M+3),B(M+3),U(Q+3),V(Q+3);
	// vector<ll>L(M+3),C(M+3),T(Q+3);
	// cin>>N>>M>>S>>Q;
	// for(int i=0;i<M;i++)cin>>A[i]>>B[i]>>L[i]>>C[i];
	// for(int i=0;i<Q;i++)cin>>U[i]>>V[i]>>T[i];
	// vector<ll>ans=calculate_necessary_time(N,M,S,Q,A,B,L,C,U,V,T);
	// for(auto to:ans)cout<<to<<"\n";
// }
#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...