제출 #1155706

#제출 시각아이디문제언어결과실행 시간메모리
1155706gygSky Walking (IOI19_walk)C++20
0 / 100
576 ms71204 KiB
#include "walk.h"
#include <bits/stdc++.h>
using namespace std;
#define sig signed
#define int long long
#define arr array
#define vec vector 
#define pii pair<int, int>
#define fir first 
#define sec second
#define pq priority_queue
const int N = 2e6 + 5, INF = 1e18;

map<pii, int> nd;
map<int, vec<int>> pnt;
map<int, vec<pii>> adj; // {node, distance}
int st, fn;

arr<bool, N> vs;
arr<int, N> dst;
pq<pii, vec<pii>, greater<pii>> ord;
void djk() {
	dst.fill(INF);

	dst[st] = 0, ord.push({0, st});
	while (ord.size()) {
		int u = ord.top().sec; ord.pop();
		if (vs[u]) continue;
		vs[u] = true;
		for (pii x : adj[u]) {
			int nw_dst = dst[u] + x.sec;
			if (nw_dst >= dst[x.fir]) continue;
			dst[x.fir] = nw_dst, ord.push({nw_dst, x.fir});
		}
	}
}

int min_distance(vec<sig> _x, vec<sig> _h, vec<sig> _l, vec<sig> _r, vec<sig> _y, sig _s, sig _f) {
	vec<vec<int>> twr, wlk;
	for (int i = 0; i < _x.size(); i++) {
		vec<int> x = {_h[i], _x[i]};
		twr.push_back(x);
	}
	for (int i = 0; i < _l.size(); i++) {
		vec<int> x = {_y[i], _x[_l[i]], _x[_r[i]]};
		wlk.push_back(x);
	}
	sort(twr.begin(), twr.end()), sort(wlk.begin(), wlk.end());

	for (int i = 0; i < _x.size(); i++) {
		int id = nd.size() + 1;
		nd[{_x[i], 0}] = id;
		pnt[_x[i]].push_back(0);
	}

	set<int> ps;
	while (wlk.size()) {
		vec<int> x = wlk.back(); wlk.pop_back();
		
		while (twr.size() && twr.back()[0] >= x[0]) {
			vec<int> y = twr.back(); twr.pop_back();
			ps.insert(y[1]);
		}

		if (!nd.count({x[1], x[0]})) {
			int id = nd.size() + 1;
			nd[{x[1], x[0]}] = id;
			pnt[x[1]].push_back(x[0]);
		}
		if (!nd.count({x[2], x[0]})) {
			int id = nd.size() + 1;
			nd[{x[2], x[0]}] = id;
			pnt[x[2]].push_back(x[0]);
		}
		int u = nd[{x[1], x[0]}], v = nd[{x[2], x[0]}], d = x[2] - x[1];
		adj[u].push_back({v, d}), adj[v].push_back({u, d});

		// for (auto it = ps.find(x[1]); it != ps.end(); it++) {
		// 	if (!nd.count({*it, x[0]})) {
		// 		int id = nd.size() + 1;
		// 		nd[{*it, x[0]}] = id;
		// 		pnt[*it].push_back(x[0]);
		// 	}
		// 	if (*it != x[1]) {
		// 		int u = nd[{*it, x[0]}], v = nd[{*next(it, -1), x[0]}], d = *it - *next(it, -1);
		// 		adj[u].push_back({v, d}), adj[v].push_back({u, d});
		// 	}
		// 	if (*it == x[2]) break;
		// }
	}

	for (pair<int, vec<int>> x : pnt) {
		sort(x.sec.begin(), x.sec.end());
		for (int i = 0; i < x.sec.size() - 1; i++) {
			int u = nd[{x.fir, x.sec[i]}], v = nd[{x.fir, x.sec[i + 1]}], d = x.sec[i + 1] - x.sec[i];
			adj[u].push_back({v, d}), adj[v].push_back({u, d});
		}
	}

	// for (pair<pii, int> x : nd) {
	// 	cout << x.fir.fir << " " << x.fir.sec << endl;
	// }

	st = nd[{_x[_s], 0}], fn = nd[{_x[_f], 0}];
	djk();
	if (!vs[fn]) return -1;
	return dst[fn];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...