제출 #1139198

#제출 시각아이디문제언어결과실행 시간메모리
1139198Math4Life2020Escape Route (JOI21_escape_route)C++20
컴파일 에러
0 ms0 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long; using pii = pair<ll,ll>;

const ll Nm = 90; const ll INF = 1e18;
pii adj[Nm][Nm]; //{travel time, latest leaving time}
vector<pii> dp[Nm][Nm]; //{latest leaving time, travel time}
ll dp3[Nm][Nm]; //time if leaving at start of day

ll rup(ll x, ll S) {
	ll y = x/S;
	if (x>(y*S)) {
		return (y+1)*S;
	} else {
		return x;
	}
}

vector<ll> calculate_necessary_time(int N, int M, ll S, int Q, vector<int> A,
	vector<int> B, vector<ll> L, vector<ll> C, vector<int> U, vector<int> V, vector<ll> T) {
	for (ll i=0;i<Nm;i++) {
		for (ll j=0;j<Nm;j++) {
			adj[i][j]={INF,-INF};
		}
	}
	for (ll m=0;m<M;m++) {
		adj[A[m]][B[m]]={L[m],C[m]-L[m]};
		adj[B[m]][A[m]]=adj[A[m]][B[m]];
	}
	for (ll x=0;x<N;x++) {
		for (ll y=0;y<N;y++) {
			if (x==y || adj[x][y].first==INF) {
				continue;
			}
			vector<ll> dp2(N,INF);
			vector<bool> pr2(N,false); //is processed
			dp2[y]=adj[x][y].first+adj[x][y].second;
			while (1) {
				ll zc = -1; ll tc = INF;
				for (ll z=0;z<N;z++) {
					if (!pr2[z] && dp2[z]<tc) {
						zc = z; tc = dp2[z];
					}
				}
				if (zc == -1) {
					break;
				}
				pr2[zc]=1;
				for (ll z1=0;z1<N;z1++) {
					if (tc<=adj[zc][z1].second) {
						dp2[z1] = min(dp2[z1],tc+adj[zc][z1].first);
					}
				}
			}
			vector<ll> dp1(N,-INF);
			vector<bool> pr1(N,false);
			dp1[x]=adj[x][y].second;
			while (1) {
				ll zc = -1; ll tc = -INF;
				for (ll z=0;z<N;z++) {
					if (!pr1[z] && dp1[z]>tc) {
						zc = z; tc = dp1[z];
					}
				}
				if (zc==-1) {
					break;
				}
				pr1[zc]=1;
				for (ll z1=0;z1<N;z1++) {
					if (tc<=(adj[z1][zc].first+adj[z1][zc].second) && (tc-adj[zc][z1].first)>=0LL) {
						dp1[z1] = max(dp1[z1],tc-adj[zc][z1].first); 
					}
				}
			}
			for (ll a=0;a<N;a++) {
				for (ll b=0;b<N;b++) {
					if (a!=b && dp1[a]!=-INF && dp2[b]!=INF) {
						dp[a][b].push_back({dp1[a],dp2[b]-dp1[a]});
					}
				}
			}
		}
	}
	for (ll x=0;x<N;x++) {
		for (ll y=0;y<N;y++) {
			dp3[x][y]=INF;
			if (x==y || dp[x][y].size()==0) {
				continue;
			}
			//dp: {latest leaving time, travel time}
			//dptw: {travel time, latest leaving time}
			vector<pii> dptw;
			for (pii p0: dp[x][y]) {
				dptw.push_back({p0.second,p0.first});
			}
			sort(dptw.begin(),dptw.end());
			dp[x][y].clear();
			ll llt0 = -INF;
			for (pii p0: dptw) {
				if (p0.second>llt0) {
					llt0 = p0.second;
					dp[x][y].push_back({p0.second,p0.first});
				}
			}
			dp3[x][y]=dptw[0].first;
		}
	}
	for (ll k=0;k<N;k++) {
		for (ll i=0;i<N;i++) {
			for (ll j=0;j<N;j++) {
				if (i==j) {
					continue;
				}
				dp3[i][j]=min(dp3[i][j],rup(dp3[i][k],S)+dp3[k][j]);
			}
		}
	}
	vector<ll> ansv; //ans vector
	for (ll q=0;q<Q;q++) {
		ll ans = INF;
		ll x = U[q]; ll y = V[q]; ll t0 = T[q];
		auto A0 = lower_bound(dp[x][y].begin(),dp[x][y].end(),(pii){t0,-INF});
		if (A0 != dp[x][y].end()) {
			ans = (*A0).second;
		}
		for (ll z=0;z<N;z++) {
			if (dp[x][z].size()>0 && dp[x][z].back().first>=t0) {
				ans = min(ans,S-t0+dp3[z][y]);
			}
		}
		ans = min(ans,S-t0+dp3[x][y]);
		ansv.push_back(ans);
	}
	return ansv;
	//exit(0);
}

int main() {
	int N_,M_,S_,Q_; cin >> N_ >> M_ >> S_ >> Q_;
	vector<int> A_,B_,U_,V_;
	vector<ll> L_,C_,T_;
	for (ll i=0;i<M_;i++) {
		ll a0,b0,l0,c0; cin >> a0 >> b0 >> l0 >> c0;
		A_.push_back(a0);
		B_.push_back(b0);
		L_.push_back(l0);
		C_.push_back(c0);
	}
	for (ll i=0;i<Q_;i++) {
		ll u0,v0,t0; cin >> u0 >> v0 >> t0;
		U_.push_back(u0);
		V_.push_back(v0);
		T_.push_back(t0);
	}
	vector<ll> finans = calculate_necessary_time(N_,M_,S_,Q_,A_,B_,L_,C_,U_,V_,T_);
	for (ll x: finans) {
		cout << x << "\n";
	}
}

컴파일 시 표준 에러 (stderr) 메시지

/usr/bin/ld: /tmp/ccU8xQ6M.o: in function `main':
grader.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/ccPC80iN.o:escape_route.cpp:(.text.startup+0x0): first defined here
collect2: error: ld returned 1 exit status