답안 #770340

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
770340 2023-07-01T05:47:43 Z SanguineChameleon Sky Walking (IOI19_walk) C++17
24 / 100
2088 ms 528128 KB
#include "walk.h"
#include <bits/stdc++.h>
using namespace std;

const long long inf = 1e18L + 20;
const int maxN = 1e5 + 20;
const int max_nodes = maxN * 12;
int X[maxN];
int Y[maxN * 2];
int H[maxN * 2];
int L[maxN];
int R[maxN];
pair<int, int> orderY[maxN * 2];
vector<int> qadd[maxN];
vector<int> qrem[maxN];
vector<int> row[maxN * 2];
vector<int> col[maxN];
long long dist[max_nodes];
vector<pair<int, int>> adj[max_nodes];
map<pair<int, int>, int> points;
int node_cnt;

int get_id(int i, int j) {
	auto it = points.find(make_pair(i, j));
	if (it == points.end()) {
		return points[make_pair(i, j)] = ++node_cnt;
	}
	else {
		return it->second;
	}
}

void add_edge(int i1, int j1, int i2, int j2) {
	int u = get_id(i1, j1);
	int v = get_id(i2, j2);
	int w = abs(X[i1] - X[i2]) + abs(Y[j1] - Y[j2]);
	adj[u].emplace_back(v, w);
	adj[v].emplace_back(u, w);
}

long long min_distance(vector<int> _X, vector<int> _H, vector<int> _L, vector<int> _R, vector<int> _Y, int _S, int _T) {
	int N = _X.size();
	int M = _L.size();
	for (int i = 1; i <= N; i++) {
		X[i] = _X[i - 1];
	}
	for (int i = 1; i <= M; i++) {
		orderY[i] = make_pair(_Y[i - 1], i);
	}
	for (int i = M + 1; i <= M + N; i++) {
		orderY[i] = make_pair(_H[i - M - 1], i);
	}
	sort(orderY + 1, orderY + N + M + 1);
	for (int i = 1; i <= N + M; i++) {
		Y[i] = orderY[i].first;
		H[orderY[i].second] = i;
	}
	for (int i = 1; i <= M; i++) {
		L[i] = _L[i - 1] + 1;
		R[i] = _R[i - 1] + 1;
		qadd[L[i]].push_back(i);
		qrem[R[i]].push_back(i);
	}
	set<int> walks;
	for (int i = 1; i <= N; i++) {
		col[i].push_back(0);
		col[i].push_back(H[M + i]);
		for (auto id: qadd[i]) {
			walks.insert(H[id]);
		}
		auto it = walks.upper_bound(H[M + i]);
		while (it != walks.begin()) {
			it--;
			col[i].push_back(*it);
			row[*it].push_back(i);
		}
		for (auto id: qrem[i]) {
			walks.erase(H[id]);
		}
	}
	for (int i = 1; i <= N; i++) {
		sort(col[i].begin(), col[i].end());
		for (int j = 0; j < (int)col[i].size() - 1; j++) {
			add_edge(i, col[i][j], i, col[i][j + 1]);
		}
	}
	for (int i = 1; i <= M; i++) {
		sort(row[H[i]].begin(), row[H[i]].end());
		for (int j = 0; j < (int)row[H[i]].size() - 1; j++) {
			add_edge(row[H[i]][j], H[i], row[H[i]][j + 1], H[i]);
		}
	}
	int S = get_id(_S + 1, 0);
	int T = get_id(_T + 1, 0);
	for (int i = 1; i <= node_cnt; i++) {
		dist[i] = inf;
	}
	dist[S] = 0;
	priority_queue<pair<long long, int>, vector<pair<long long, int>>, greater<pair<long long, int>>> Q;
	Q.emplace(0, S);
	while (!Q.empty()) {
		int u = Q.top().second;
		if (Q.top().first != dist[u]) {
			Q.pop();
			continue;
		}
		Q.pop();
		for (auto e: adj[u]) {
			int v = e.first;
			int w = e.second;
			if (dist[u] + w < dist[v]) {
				dist[v] = dist[u] + w;
				Q.emplace(dist[v], v);
			}
		}
	}
	if (dist[T] == inf) {
		return -1;
	}
	else {
		return dist[T];
	}
}
# 결과 실행 시간 메모리 Grader output
1 Correct 19 ms 40276 KB Output is correct
2 Correct 18 ms 40276 KB Output is correct
3 Correct 18 ms 40280 KB Output is correct
4 Correct 19 ms 40276 KB Output is correct
5 Correct 20 ms 40300 KB Output is correct
6 Correct 22 ms 40404 KB Output is correct
7 Correct 20 ms 40288 KB Output is correct
8 Correct 18 ms 40248 KB Output is correct
9 Correct 19 ms 40276 KB Output is correct
10 Correct 19 ms 40404 KB Output is correct
11 Correct 18 ms 40300 KB Output is correct
12 Correct 19 ms 40280 KB Output is correct
13 Correct 20 ms 40244 KB Output is correct
14 Correct 20 ms 40260 KB Output is correct
15 Correct 19 ms 40236 KB Output is correct
16 Correct 19 ms 40276 KB Output is correct
17 Correct 19 ms 40404 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 18 ms 40148 KB Output is correct
2 Correct 19 ms 40276 KB Output is correct
3 Correct 1472 ms 163532 KB Output is correct
4 Correct 1333 ms 191064 KB Output is correct
5 Correct 994 ms 173740 KB Output is correct
6 Correct 932 ms 161260 KB Output is correct
7 Correct 989 ms 173824 KB Output is correct
8 Correct 2088 ms 197008 KB Output is correct
9 Correct 1201 ms 170552 KB Output is correct
10 Correct 1856 ms 241344 KB Output is correct
11 Correct 710 ms 118284 KB Output is correct
12 Correct 493 ms 114996 KB Output is correct
13 Correct 1544 ms 222000 KB Output is correct
14 Correct 448 ms 110348 KB Output is correct
15 Correct 535 ms 113516 KB Output is correct
16 Correct 490 ms 112844 KB Output is correct
17 Correct 474 ms 110300 KB Output is correct
18 Correct 488 ms 111080 KB Output is correct
19 Correct 34 ms 43592 KB Output is correct
20 Correct 168 ms 74576 KB Output is correct
21 Correct 429 ms 106336 KB Output is correct
22 Correct 448 ms 114228 KB Output is correct
23 Correct 661 ms 122012 KB Output is correct
24 Correct 480 ms 112576 KB Output is correct
25 Correct 430 ms 110328 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 169 ms 64584 KB Output is correct
2 Runtime error 1315 ms 528128 KB Execution killed with signal 11
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 169 ms 64584 KB Output is correct
2 Runtime error 1315 ms 528128 KB Execution killed with signal 11
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 19 ms 40276 KB Output is correct
2 Correct 18 ms 40276 KB Output is correct
3 Correct 18 ms 40280 KB Output is correct
4 Correct 19 ms 40276 KB Output is correct
5 Correct 20 ms 40300 KB Output is correct
6 Correct 22 ms 40404 KB Output is correct
7 Correct 20 ms 40288 KB Output is correct
8 Correct 18 ms 40248 KB Output is correct
9 Correct 19 ms 40276 KB Output is correct
10 Correct 19 ms 40404 KB Output is correct
11 Correct 18 ms 40300 KB Output is correct
12 Correct 19 ms 40280 KB Output is correct
13 Correct 20 ms 40244 KB Output is correct
14 Correct 20 ms 40260 KB Output is correct
15 Correct 19 ms 40236 KB Output is correct
16 Correct 19 ms 40276 KB Output is correct
17 Correct 19 ms 40404 KB Output is correct
18 Correct 18 ms 40148 KB Output is correct
19 Correct 19 ms 40276 KB Output is correct
20 Correct 1472 ms 163532 KB Output is correct
21 Correct 1333 ms 191064 KB Output is correct
22 Correct 994 ms 173740 KB Output is correct
23 Correct 932 ms 161260 KB Output is correct
24 Correct 989 ms 173824 KB Output is correct
25 Correct 2088 ms 197008 KB Output is correct
26 Correct 1201 ms 170552 KB Output is correct
27 Correct 1856 ms 241344 KB Output is correct
28 Correct 710 ms 118284 KB Output is correct
29 Correct 493 ms 114996 KB Output is correct
30 Correct 1544 ms 222000 KB Output is correct
31 Correct 448 ms 110348 KB Output is correct
32 Correct 535 ms 113516 KB Output is correct
33 Correct 490 ms 112844 KB Output is correct
34 Correct 474 ms 110300 KB Output is correct
35 Correct 488 ms 111080 KB Output is correct
36 Correct 34 ms 43592 KB Output is correct
37 Correct 168 ms 74576 KB Output is correct
38 Correct 429 ms 106336 KB Output is correct
39 Correct 448 ms 114228 KB Output is correct
40 Correct 661 ms 122012 KB Output is correct
41 Correct 480 ms 112576 KB Output is correct
42 Correct 430 ms 110328 KB Output is correct
43 Correct 169 ms 64584 KB Output is correct
44 Runtime error 1315 ms 528128 KB Execution killed with signal 11
45 Halted 0 ms 0 KB -