답안 #232326

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
232326 2020-05-16T17:37:38 Z ksun48 Railway Trip (JOI17_railway_trip) C++14
30 / 100
2000 ms 122352 KB
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
 
int main(){
	cin.sync_with_stdio(0); cin.tie(0);
	//int next[2][1000][20]; // next stop of level <= j, you are <= j+1 (taking trains of j+1)
	//int idx[1000][21];
  int next[2][100000][101]; // next stop of level <= j, you are <= j+1 (taking trains of j+1)
  int idx[100000][101];
	int n, k, q;
	cin >> n >> k >> q;
	vector<int> level(n);
	for(int i = 0; i < n; i++){
		cin >> level[i];
		level[i] = k - level[i];
	}
	vector<pair<int,int> > queries;
	for(int i = 0; i < q; i++){
		int a, b;
		cin >> a >> b;
		a--; b--;
		queries.push_back({a,b});
	}
	for(int j = 0; j <= k; j++){
		int cur = 0;
		for(int i = 0; i < n; i++){
			if(level[i] <= j){
				idx[i][j] = cur;
				cur++;
			}
		}
	}
	for(int j = 0; j < k; j++){
		int prev = 0;
		for(int i = 0; i < n; i++){
			if(level[i] > j+1) continue;
			if(level[i] <= j){
				prev = i;
			}
			next[0][i][j] = prev;
		}
		prev = n-1;
		for(int i = n-1; i >= 0; i--){
			if(level[i] > j+1) continue;
			if(level[i] <= j){
				prev = i;
			}
			next[1][i][j] = prev;
		}
	}
	for(int zz = 0; zz < queries.size(); zz++){
		pair<int,int> stuff[2][2]; // person, then side
		stuff[0][0] = stuff[0][1] = {queries[zz].first, 0};
		stuff[1][0] = stuff[1][1] = {queries[zz].second, 0};
		int ans = 1000000000;
		for(int j = k-1; j >= 0; j--){
			// go to level j
			for(int p = 0; p < 2; p++){
				pair<int,int> newstuff[2];
				newstuff[0] = make_pair(next[0][stuff[p][0].first ][j], 1000000000);
				newstuff[1] = make_pair(next[1][stuff[p][1].first ][j], 1000000000);
				for(int i = 0; i < 2; i++){
					pair<int,int> x = stuff[p][i];
					// go left from x, go right from x;
					int loc = x.first;
					int dist = x.second;
					for(int dir = 0; dir < 2; dir++){
						int newloc = next[dir][loc][j];
						int newdist = dist + abs(idx[ loc ][j+1] - idx[ newloc ][j+1]);
						for(int qq = 0; qq < 2; qq++){
							if(newstuff[qq].first == newloc){
								newstuff[qq].second = min(newstuff[qq].second, newdist);
							}
						}
					}
				}
				stuff[p][0] = newstuff[0];
				stuff[p][1] = newstuff[1];
			}
			// find ans
			for(int i0 = 0; i0 < 2; i0++){
				pair<int,int> x0 = stuff[0][i0];
				for(int i1 = 0; i1 < 2; i1++){
					pair<int,int> x1 = stuff[1][i1];
					ans = min(ans, x0.second + x1.second + abs(idx[x0.first][j] - idx[x1.first][j]));
				}
			}
		}
		cout << ans - 1 << '\n';
	}
}
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 512 KB Output is correct
2 Correct 5 ms 512 KB Output is correct
3 Correct 5 ms 512 KB Output is correct
4 Correct 5 ms 512 KB Output is correct
5 Correct 5 ms 512 KB Output is correct
6 Correct 5 ms 512 KB Output is correct
7 Correct 6 ms 512 KB Output is correct
8 Correct 5 ms 512 KB Output is correct
9 Correct 5 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 16 ms 1536 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 313 ms 122096 KB Output is correct
2 Correct 248 ms 122096 KB Output is correct
3 Correct 315 ms 122168 KB Output is correct
4 Correct 305 ms 122224 KB Output is correct
5 Correct 332 ms 122092 KB Output is correct
6 Correct 335 ms 122096 KB Output is correct
7 Correct 349 ms 122096 KB Output is correct
8 Correct 143 ms 122096 KB Output is correct
9 Correct 194 ms 122224 KB Output is correct
10 Correct 214 ms 122224 KB Output is correct
11 Correct 218 ms 122220 KB Output is correct
12 Correct 218 ms 122220 KB Output is correct
13 Correct 213 ms 122352 KB Output is correct
14 Correct 229 ms 122220 KB Output is correct
15 Correct 255 ms 122096 KB Output is correct
16 Correct 321 ms 122100 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 2097 ms 42992 KB Time limit exceeded
2 Halted 0 ms 0 KB -