답안 #55055

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
55055 2018-07-06T00:00:29 Z ksun48 Railway Trip (JOI17_railway_trip) C++14
0 / 100
2000 ms 525312 KB
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;

int main(){
	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});
	}
	int next[2][n][k]; // next stop of level <= j, you are <= j+1 (taking trains of j+1)
	int idx[n][k+1];
	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++){
		vector<pair<int,int> > stuff[2]; // loc, dist
		stuff[0].push_back({queries[zz].first, 0});
		stuff[1].push_back({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++){
				vector<pair<int,int> > newstuff;
				for(pair<int,int> x : stuff[p]){
					// 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]);
						newstuff.push_back({newloc, newdist});
					}
				}
				int a = 0;
				while(a + 1 < newstuff.size()){
					if(newstuff[a].first == newstuff[a+1].first){
						newstuff[a].second = min(newstuff[a].second, newstuff[a+1].second);
						newstuff.erase(newstuff.begin() + a + 1);
					}
					a++;
				}
				stuff[p] = newstuff;
			}
			// find ans
			for(pair<int,int> x0 : stuff[0]){
				for(pair<int,int> x1 : stuff[1]){
					ans = min(ans, x0.second + x1.second + abs(idx[x0.first][j] - idx[x1.first][j]));
				}
			}
		}
		cout << ans - 1 << '\n';
	}
}
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 376 KB Output is correct
2 Correct 7 ms 488 KB Output is correct
3 Correct 7 ms 556 KB Output is correct
4 Correct 8 ms 588 KB Output is correct
5 Correct 4 ms 636 KB Output is correct
6 Execution timed out 2057 ms 4432 KB Time limit exceeded
7 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 172 ms 12504 KB Output is correct
2 Correct 48 ms 12988 KB Output is correct
3 Correct 83 ms 24760 KB Output is correct
4 Correct 241 ms 60044 KB Output is correct
5 Correct 313 ms 118840 KB Output is correct
6 Execution timed out 2085 ms 525312 KB Time limit exceeded
7 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 1208 ms 525312 KB Memory limit exceeded 525312 {'time-wall': '1.264', 'max-rss': '19492', 'csw-forced': '25', 'cg-mem': '525312', 'time': '1.208', 'csw-voluntary': '2'} 524288
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 108 ms 525312 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -