답안 #519430

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
519430 2022-01-26T10:53:37 Z fatemetmhr Escape Route (JOI21_escape_route) C++17
35 / 100
9000 ms 226940 KB
//  ~Be name khoda~  //

#include "escape_route.h"
#include<bits/stdc++.h>

#pragma GCC optimize("Ofast,unroll-loops")
#pragma GCC target("avx2")

using namespace std;

typedef long long ll;

#define pb       push_back
#define mp       make_pair
#define all(x)   x.begin(), x.end()
#define fi       first
#define se       second
#define cl       clear
#define endll    '\n'

const int maxn  =  1e6   + 10;
const int maxn5 =  91;
const int maxq  =  3e6   + 5;
const int maxe  =  4e3   + 10;
const int mod   =  1e9   +  7;
const ll  inf   =  2e18;

ll t[maxq], c[maxe], l[maxe];
int u[maxq], v[maxq];
int a[maxe], b[maxe];
int n, m, q;
ll s, ans[maxq], mn, tim[maxn5];
bool ok[maxn5], done[maxn5];
ll dis[maxn5], with0[maxn5][maxn5];
int adj[maxn5][maxn5];
vector <int> av[maxn5];

inline bool cmp(int i, int j){return t[i] < t[j];}

inline void fix(ll &a){
	if(a >= s)
		a -= s;
}

inline void dij(int v, ll ti){
	//cout << "hola " << v << ' ' << ti << endl;
	memset(dis, -1, sizeof dis);
	memset(done, false, sizeof done);
	memset(ok, false, sizeof ok);
	dis[v] = 0;
	tim[v] = ti;
	ok[v] = true;
	
	mn = inf;
	for(int i = 0; i < n; i++){
		int v = -1;
		for(int j = 0; j < n; j++) if(!done[j] && dis[j] > -1 && (v == -1 || dis[j] < dis[v])){
			v = j;
		}
		done[v] = true;
		//cout << "ok " << v << ' ' << dis[v] << ' ' << tim[v] << endl;
		for(int j = 0; j < n; j++) if(adj[v][j] != -1 && !done[j]){
			ll len;
			if(tim[v] <= c[adj[v][j]] - l[adj[v][j]]){
				if(ok[v]){
					ok[j] = true;
					mn = min(mn, c[adj[v][j]] - l[adj[v][j]] - tim[v]);
				}
				len = l[adj[v][j]];
			}
			else{
				len = s - tim[v] + l[adj[v][j]];
			}
			//cout << v << ' ' << j << ' ' << len << ' ' << adj[v][j] << ' ' << l[adj[v][j]] << endl;
			if(dis[j] == -1 || dis[j] > dis[v] + len){
				dis[j] = dis[v] + len;
				tim[j] = tim[v] + len;
				fix(tim[j]);
			}
		}
	}
	return;
}

std::vector<long long> calculate_necessary_time(
    int N, int M, long long S, int Q, std::vector<int> A, std::vector<int> B,
    std::vector<long long> L, std::vector<long long> C, std::vector<int> U,
    std::vector<int> V, std::vector<long long> T) {
    
    n = N;
    m = M;
    s = S;
    q = Q;
    memset(adj, -1, sizeof adj);
    for(int i = 0; i < m; i++){
    	a[i] = A[i];
    	b[i] = B[i];
    	l[i] = L[i];
    	c[i] = C[i];
    	adj[a[i]][b[i]] = adj[b[i]][a[i]] = i;
    }
    for(int i = 0; i < q; i++){
    	u[i] = U[i];
    	v[i] = V[i];
    	t[i] = T[i];
    	av[u[i]].pb(i);
    }
    //*
    for(int i = 0; i < n; i++){
    	dij(i, 0);
    	for(int j = 0; j < n; j++)
    		with0[i][j] = dis[j];
    }
    //*/
    
    for(int i = 0; i < n; i++){
    	sort(all(av[i]), cmp);
    	ll last = 0;
    	dij(i, 0);
    	for(auto j : av[i]){
    		if(mn < t[j] - last){
    			last = t[j];
    			dij(i, last);
    			ans[j] = dis[v[j]];
    		}
    		else{
    			mn -= (t[j] - last);
    			ans[j] = inf;
    			for(int z = 0; z < n; z++) if(ok[z]){
    				if(z == v[j])
    					ans[j] = min(ans[j], dis[z]);
    				ans[j] = min(ans[j], dis[z] + s - (tim[z] + (t[j] - last)) + with0[z][v[j]]);
    			}
    		}
    	}
    }
    
    vector <long long> ret;
    for(int i = 0; i < q; i++)
    	ret.pb(ans[i]);
    
    return ret;
}












# 결과 실행 시간 메모리 Grader output
1 Correct 27 ms 64972 KB Output is correct
2 Correct 31 ms 65036 KB Output is correct
3 Correct 38 ms 65040 KB Output is correct
4 Correct 25 ms 65044 KB Output is correct
5 Correct 27 ms 64972 KB Output is correct
6 Correct 27 ms 65020 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2165 ms 198260 KB Output is correct
2 Correct 2089 ms 214688 KB Output is correct
3 Correct 2085 ms 203984 KB Output is correct
4 Correct 2214 ms 218372 KB Output is correct
5 Correct 2215 ms 217124 KB Output is correct
6 Correct 28 ms 64972 KB Output is correct
7 Correct 2163 ms 199652 KB Output is correct
8 Correct 1682 ms 226940 KB Output is correct
9 Correct 2045 ms 188100 KB Output is correct
10 Correct 2199 ms 214524 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 27 ms 64972 KB Output is correct
2 Correct 31 ms 65036 KB Output is correct
3 Correct 38 ms 65040 KB Output is correct
4 Correct 25 ms 65044 KB Output is correct
5 Correct 27 ms 64972 KB Output is correct
6 Correct 27 ms 65020 KB Output is correct
7 Correct 2165 ms 198260 KB Output is correct
8 Correct 2089 ms 214688 KB Output is correct
9 Correct 2085 ms 203984 KB Output is correct
10 Correct 2214 ms 218372 KB Output is correct
11 Correct 2215 ms 217124 KB Output is correct
12 Correct 28 ms 64972 KB Output is correct
13 Correct 2163 ms 199652 KB Output is correct
14 Correct 1682 ms 226940 KB Output is correct
15 Correct 2045 ms 188100 KB Output is correct
16 Correct 2199 ms 214524 KB Output is correct
17 Correct 3774 ms 197908 KB Output is correct
18 Correct 3674 ms 196984 KB Output is correct
19 Correct 2680 ms 213532 KB Output is correct
20 Correct 3225 ms 200916 KB Output is correct
21 Correct 3723 ms 213132 KB Output is correct
22 Correct 3710 ms 211896 KB Output is correct
23 Correct 3586 ms 197116 KB Output is correct
24 Correct 1463 ms 223120 KB Output is correct
25 Correct 3700 ms 184540 KB Output is correct
26 Correct 3693 ms 208124 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 27 ms 64972 KB Output is correct
2 Correct 31 ms 65036 KB Output is correct
3 Correct 38 ms 65040 KB Output is correct
4 Correct 25 ms 65044 KB Output is correct
5 Correct 27 ms 64972 KB Output is correct
6 Correct 27 ms 65020 KB Output is correct
7 Correct 2165 ms 198260 KB Output is correct
8 Correct 2089 ms 214688 KB Output is correct
9 Correct 2085 ms 203984 KB Output is correct
10 Correct 2214 ms 218372 KB Output is correct
11 Correct 2215 ms 217124 KB Output is correct
12 Correct 28 ms 64972 KB Output is correct
13 Correct 2163 ms 199652 KB Output is correct
14 Correct 1682 ms 226940 KB Output is correct
15 Correct 2045 ms 188100 KB Output is correct
16 Correct 2199 ms 214524 KB Output is correct
17 Correct 3774 ms 197908 KB Output is correct
18 Correct 3674 ms 196984 KB Output is correct
19 Correct 2680 ms 213532 KB Output is correct
20 Correct 3225 ms 200916 KB Output is correct
21 Correct 3723 ms 213132 KB Output is correct
22 Correct 3710 ms 211896 KB Output is correct
23 Correct 3586 ms 197116 KB Output is correct
24 Correct 1463 ms 223120 KB Output is correct
25 Correct 3700 ms 184540 KB Output is correct
26 Correct 3693 ms 208124 KB Output is correct
27 Execution timed out 9036 ms 132768 KB Time limit exceeded
28 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 27 ms 64972 KB Output is correct
2 Correct 31 ms 65036 KB Output is correct
3 Correct 38 ms 65040 KB Output is correct
4 Correct 25 ms 65044 KB Output is correct
5 Correct 27 ms 64972 KB Output is correct
6 Correct 27 ms 65020 KB Output is correct
7 Correct 2165 ms 198260 KB Output is correct
8 Correct 2089 ms 214688 KB Output is correct
9 Correct 2085 ms 203984 KB Output is correct
10 Correct 2214 ms 218372 KB Output is correct
11 Correct 2215 ms 217124 KB Output is correct
12 Correct 28 ms 64972 KB Output is correct
13 Correct 2163 ms 199652 KB Output is correct
14 Correct 1682 ms 226940 KB Output is correct
15 Correct 2045 ms 188100 KB Output is correct
16 Correct 2199 ms 214524 KB Output is correct
17 Correct 3774 ms 197908 KB Output is correct
18 Correct 3674 ms 196984 KB Output is correct
19 Correct 2680 ms 213532 KB Output is correct
20 Correct 3225 ms 200916 KB Output is correct
21 Correct 3723 ms 213132 KB Output is correct
22 Correct 3710 ms 211896 KB Output is correct
23 Correct 3586 ms 197116 KB Output is correct
24 Correct 1463 ms 223120 KB Output is correct
25 Correct 3700 ms 184540 KB Output is correct
26 Correct 3693 ms 208124 KB Output is correct
27 Execution timed out 9036 ms 132768 KB Time limit exceeded
28 Halted 0 ms 0 KB -