답안 #519424

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

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

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 25 ms 64972 KB Output is correct
2 Correct 32 ms 64952 KB Output is correct
3 Correct 43 ms 65068 KB Output is correct
4 Correct 30 ms 64940 KB Output is correct
5 Correct 26 ms 65000 KB Output is correct
6 Correct 26 ms 64980 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2233 ms 231280 KB Output is correct
2 Correct 2219 ms 254640 KB Output is correct
3 Correct 2328 ms 235364 KB Output is correct
4 Correct 2595 ms 263840 KB Output is correct
5 Correct 2536 ms 262976 KB Output is correct
6 Correct 34 ms 64980 KB Output is correct
7 Correct 2621 ms 235144 KB Output is correct
8 Correct 1826 ms 276880 KB Output is correct
9 Correct 2209 ms 223512 KB Output is correct
10 Correct 2313 ms 262700 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 64972 KB Output is correct
2 Correct 32 ms 64952 KB Output is correct
3 Correct 43 ms 65068 KB Output is correct
4 Correct 30 ms 64940 KB Output is correct
5 Correct 26 ms 65000 KB Output is correct
6 Correct 26 ms 64980 KB Output is correct
7 Correct 2233 ms 231280 KB Output is correct
8 Correct 2219 ms 254640 KB Output is correct
9 Correct 2328 ms 235364 KB Output is correct
10 Correct 2595 ms 263840 KB Output is correct
11 Correct 2536 ms 262976 KB Output is correct
12 Correct 34 ms 64980 KB Output is correct
13 Correct 2621 ms 235144 KB Output is correct
14 Correct 1826 ms 276880 KB Output is correct
15 Correct 2209 ms 223512 KB Output is correct
16 Correct 2313 ms 262700 KB Output is correct
17 Correct 4241 ms 235500 KB Output is correct
18 Correct 4139 ms 234192 KB Output is correct
19 Correct 2880 ms 257964 KB Output is correct
20 Correct 3674 ms 238652 KB Output is correct
21 Correct 4083 ms 266448 KB Output is correct
22 Correct 4281 ms 265208 KB Output is correct
23 Correct 4003 ms 238660 KB Output is correct
24 Correct 1600 ms 279288 KB Output is correct
25 Correct 4090 ms 225660 KB Output is correct
26 Correct 4307 ms 266740 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 64972 KB Output is correct
2 Correct 32 ms 64952 KB Output is correct
3 Correct 43 ms 65068 KB Output is correct
4 Correct 30 ms 64940 KB Output is correct
5 Correct 26 ms 65000 KB Output is correct
6 Correct 26 ms 64980 KB Output is correct
7 Correct 2233 ms 231280 KB Output is correct
8 Correct 2219 ms 254640 KB Output is correct
9 Correct 2328 ms 235364 KB Output is correct
10 Correct 2595 ms 263840 KB Output is correct
11 Correct 2536 ms 262976 KB Output is correct
12 Correct 34 ms 64980 KB Output is correct
13 Correct 2621 ms 235144 KB Output is correct
14 Correct 1826 ms 276880 KB Output is correct
15 Correct 2209 ms 223512 KB Output is correct
16 Correct 2313 ms 262700 KB Output is correct
17 Correct 4241 ms 235500 KB Output is correct
18 Correct 4139 ms 234192 KB Output is correct
19 Correct 2880 ms 257964 KB Output is correct
20 Correct 3674 ms 238652 KB Output is correct
21 Correct 4083 ms 266448 KB Output is correct
22 Correct 4281 ms 265208 KB Output is correct
23 Correct 4003 ms 238660 KB Output is correct
24 Correct 1600 ms 279288 KB Output is correct
25 Correct 4090 ms 225660 KB Output is correct
26 Correct 4307 ms 266740 KB Output is correct
27 Execution timed out 9086 ms 176804 KB Time limit exceeded
28 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 64972 KB Output is correct
2 Correct 32 ms 64952 KB Output is correct
3 Correct 43 ms 65068 KB Output is correct
4 Correct 30 ms 64940 KB Output is correct
5 Correct 26 ms 65000 KB Output is correct
6 Correct 26 ms 64980 KB Output is correct
7 Correct 2233 ms 231280 KB Output is correct
8 Correct 2219 ms 254640 KB Output is correct
9 Correct 2328 ms 235364 KB Output is correct
10 Correct 2595 ms 263840 KB Output is correct
11 Correct 2536 ms 262976 KB Output is correct
12 Correct 34 ms 64980 KB Output is correct
13 Correct 2621 ms 235144 KB Output is correct
14 Correct 1826 ms 276880 KB Output is correct
15 Correct 2209 ms 223512 KB Output is correct
16 Correct 2313 ms 262700 KB Output is correct
17 Correct 4241 ms 235500 KB Output is correct
18 Correct 4139 ms 234192 KB Output is correct
19 Correct 2880 ms 257964 KB Output is correct
20 Correct 3674 ms 238652 KB Output is correct
21 Correct 4083 ms 266448 KB Output is correct
22 Correct 4281 ms 265208 KB Output is correct
23 Correct 4003 ms 238660 KB Output is correct
24 Correct 1600 ms 279288 KB Output is correct
25 Correct 4090 ms 225660 KB Output is correct
26 Correct 4307 ms 266740 KB Output is correct
27 Execution timed out 9086 ms 176804 KB Time limit exceeded
28 Halted 0 ms 0 KB -