답안 #814857

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
814857 2023-08-08T10:41:19 Z ymm Sky Walking (IOI19_walk) C++17
25 / 100
2076 ms 1048576 KB
#include "walk.h"
#include <bits/stdc++.h>
#define Loop(x,l,r) for (ll x = (l); x < (ll)(r); ++x)
#define LoopR(x,l,r) for (ll x = (r)-1; x >= (ll)(l); --x)
typedef long long ll;
typedef std::pair<int, int> pii;
typedef std::pair<ll , ll > pll;
using namespace std;

const int N = 100'010;

struct node {
	vector<pair<node *, ll>> a;
	bool vis;
	ll dis;
};

struct {
	node lp, mp, rp;
	int lpr, mpl, mpr, rpl;
	int l, r, h;
} walk[N];

namespace seg {
	int mx[N*4];
	int t[N*4];
	int sz;
	
	void get(int l, int r, int h, vector<int> &ans, int i, int b, int e) {
		if (r <= b || e <= l || mx[i] < h || t[i] == -2)
			return;
		if (l <= b && e <= r && t[i] != -1) {
			if (ans.empty() || ans.back() != t[i])
				ans.push_back(t[i]);
			return;
		}
		if (t[i] != -1)
			t[2*i+1] = t[2*i+2] = t[i];
		get(l, r, h, ans, 2*i+1, b, (b+e)/2);
		get(l, r, h, ans, 2*i+2, (b+e)/2, e);
	}
	vector<int> get(int l, int r, int h) {
		vector<int> ans;
		get(l, r, h, ans, 0, 0, sz);
		return ans;
	}

	void up(int l, int r, int x, int i, int b, int e) {
		if (l <= b && e <= r) {
			t[i] = x;
			return;
		}
		if (r <= b || e <= l)
			return;
		if (t[i] != -1)
			t[2*i+1] = t[2*i+2] = t[i];
		up(l, r, x, 2*i+1, b, (b+e)/2);
		up(l, r, x, 2*i+2, (b+e)/2, e);
		t[i] = t[2*i+1] == t[2*i+2]? t[2*i+1]: -1;
	}
	void up(int l, int r, int x) { up(l, r, x, 0, 0, sz); }

	int lrmost(int l, int r, bool d, int h, int i, int b, int e) {
		if (mx[i] < h || r <= b || e <= l)
			return -1;
		if (e-b == 1)
			return b;
		int x;
		if ((x = lrmost(l, r, d, h, 2*i+1+ d, d? (b+e)/2: b, d? e: (b+e)/2)) != -1)
			return x;
		if ((x = lrmost(l, r, d, h, 2*i+1+!d, d? b: (b+e)/2, d? (b+e)/2: e)) != -1)
			return x;
		return -1;
	}
	int leftmost(int l, int r, int h) { return lrmost(l, r, 0, h, 0, 0, sz); }
	int rightmost(int l, int r, int h) { return lrmost(l, r, 1, h, 0, 0, sz); }

	void init(const vector<int> &vec, int i, int b, int e) {
		t[i] = -2;
		if (e-b == 1) {
			mx[i] = vec[b];
			return;
		}
		init(vec, 2*i+1, b, (b+e)/2);
		init(vec, 2*i+2, (b+e)/2, e);
		mx[i] = max(mx[2*i+1], mx[2*i+2]);
	}
	void init(const vector<int> &vec) {
		sz = vec.size();
		init(vec, 0, 0, sz);
	}
}

pii get_walk(node *v)
{
	long vi = (long)(void *)v;
	long wi = (long)(void *)walk;
	long x = (vi - wi)/sizeof(*walk);
	long y = (vi - wi)%sizeof(*walk);
	y /= sizeof(node);
	return {x, y};
}

void spfa(node *s)
{
	s->dis = 0;
	s->vis = 1;
	vector<node *> q = {s};
	Loop (i,0,q.size()) {
		node *v = q[i];
		v->vis = 0;
		for (auto [u, w] : v->a) {
			if (v->dis + w < u->dis) {
				u->dis = v->dis + w;
				if (!u->vis) {
					u->vis = 1;
					q.push_back(u);
				}
			}
		}
	}
}


long long min_distance(std::vector<int> pos, std::vector<int> height, std::vector<int> l, std::vector<int> r, std::vector<int> h, int s, int g) {
	if (s > g)
		swap(s, g);
	vector<tuple<int,int,int>> w;
	Loop (i,0,h.size())
		w.emplace_back(h[i], l[i], r[i]);
	w.emplace_back(0, s, s);
	w.emplace_back(0, g, g);
	sort(w.begin(), w.end());
	seg::init(height);
	Loop (i,0,w.size()) {
		auto [h, l, r] = w[i];
		walk[i].l = l;
		walk[i].r = r;
		walk[i].h = h;
		bool hl = 0, hm = 0, hr = 0;
		if (l < s) {
			hl = 1;
			walk[i].lpr = seg::rightmost(l, s, h);
			vector<int> vec = seg::get(l, s, h);
			for (int j : vec) {
				walk[i].lp.a.emplace_back(&walk[j].lp, 2ll*(pos[walk[i].lpr] - pos[walk[j].lpr]) + abs(walk[i].h - walk[j].h));
				walk[j].lp.a.emplace_back(&walk[i].lp, 2ll*(pos[walk[j].lpr] - pos[walk[i].lpr]) + abs(walk[i].h - walk[j].h));
			}
		}
		if (l <= g || s <= r) {
			int ls = max(l, s);
			int rs = min(r, g)+1;
			walk[i].mpl = seg::leftmost(ls, rs, h);
			walk[i].mpr = seg::rightmost(ls, rs, h);
			vector<int> vec = seg::get(ls, rs, h);
			hm = vec.size();
			for (int j : vec) {
				walk[i].mp.a.emplace_back(&walk[j].mp, abs(walk[i].h - walk[j].h));
				walk[j].mp.a.emplace_back(&walk[i].mp, abs(walk[i].h - walk[j].h));
			}
		}
		if (g < r) {
			hr = 1;
			walk[i].rpl = seg::leftmost(g+1, r+1, h);
			vector<int> vec = seg::get(g+1, r+1, h);
			for (int j : vec) {
				walk[i].rp.a.emplace_back(&walk[j].rp, 2ll*(pos[walk[j].rpl] - pos[walk[i].rpl]) + abs(walk[i].h - walk[j].h));
				walk[j].rp.a.emplace_back(&walk[i].rp, 2ll*(pos[walk[i].rpl] - pos[walk[j].rpl]) + abs(walk[i].h - walk[j].h));
			}
		}
		if (hl && hm) {
			walk[i].lp.a.emplace_back(&walk[i].mp, 2*(pos[walk[i].mpl] - pos[s]));
			walk[i].mp.a.emplace_back(&walk[i].lp, 2*(pos[s] - pos[walk[i].lpr]));
		}
		if (hl && hr && !hm) {
			walk[i].lp.a.emplace_back(&walk[i].rp, 2*(pos[walk[i].rpl] - pos[s]));
			walk[i].rp.a.emplace_back(&walk[i].lp, 2*(pos[s] - pos[walk[i].lpr]));
		}
		if (hm && hr) {
			walk[i].mp.a.emplace_back(&walk[i].rp, 2*(pos[walk[i].rpl] - pos[walk[i].mpr]));
			walk[i].rp.a.emplace_back(&walk[i].mp, 0);
		}
		walk[i].lp.dis = walk[i].mp.dis = walk[i].rp.dis = 1e18;
		seg::up(l, r+1, i);
	}
	spfa(&walk[1].mp);
	if (walk[0].mp.dis >= (ll)1e18)
		return -1;
	return walk[0].mp.dis + pos[g] - pos[s];
}
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 15188 KB Output is correct
2 Correct 7 ms 15188 KB Output is correct
3 Correct 7 ms 15188 KB Output is correct
4 Correct 7 ms 15108 KB Output is correct
5 Correct 7 ms 15180 KB Output is correct
6 Correct 7 ms 15188 KB Output is correct
7 Correct 7 ms 15188 KB Output is correct
8 Correct 7 ms 15188 KB Output is correct
9 Correct 8 ms 15188 KB Output is correct
10 Correct 9 ms 15180 KB Output is correct
11 Correct 7 ms 15200 KB Output is correct
12 Correct 9 ms 15188 KB Output is correct
13 Correct 7 ms 15180 KB Output is correct
14 Correct 7 ms 15188 KB Output is correct
15 Correct 7 ms 15184 KB Output is correct
16 Correct 7 ms 15188 KB Output is correct
17 Correct 7 ms 15180 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 15188 KB Output is correct
2 Correct 7 ms 15188 KB Output is correct
3 Runtime error 1734 ms 1048576 KB Execution killed with signal 9
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 211 ms 87668 KB Output is correct
2 Correct 143 ms 34144 KB Output is correct
3 Correct 184 ms 35020 KB Output is correct
4 Correct 258 ms 39384 KB Output is correct
5 Correct 245 ms 38100 KB Output is correct
6 Correct 228 ms 36976 KB Output is correct
7 Correct 112 ms 29104 KB Output is correct
8 Correct 178 ms 29160 KB Output is correct
9 Correct 206 ms 35744 KB Output is correct
10 Correct 143 ms 30012 KB Output is correct
11 Correct 17 ms 16992 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 211 ms 87668 KB Output is correct
2 Correct 143 ms 34144 KB Output is correct
3 Correct 184 ms 35020 KB Output is correct
4 Correct 258 ms 39384 KB Output is correct
5 Correct 245 ms 38100 KB Output is correct
6 Correct 228 ms 36976 KB Output is correct
7 Correct 112 ms 29104 KB Output is correct
8 Correct 178 ms 29160 KB Output is correct
9 Correct 206 ms 35744 KB Output is correct
10 Correct 143 ms 30012 KB Output is correct
11 Correct 17 ms 16992 KB Output is correct
12 Correct 184 ms 37072 KB Output is correct
13 Correct 234 ms 43324 KB Output is correct
14 Correct 236 ms 42208 KB Output is correct
15 Correct 162 ms 35944 KB Output is correct
16 Correct 170 ms 37156 KB Output is correct
17 Correct 191 ms 38304 KB Output is correct
18 Correct 164 ms 35936 KB Output is correct
19 Correct 174 ms 35312 KB Output is correct
20 Correct 127 ms 31908 KB Output is correct
21 Correct 27 ms 20844 KB Output is correct
22 Correct 163 ms 35860 KB Output is correct
23 Correct 155 ms 34892 KB Output is correct
24 Correct 143 ms 31460 KB Output is correct
25 Correct 157 ms 33980 KB Output is correct
26 Correct 135 ms 29724 KB Output is correct
27 Correct 233 ms 42196 KB Output is correct
28 Correct 1830 ms 172468 KB Output is correct
29 Correct 223 ms 41036 KB Output is correct
30 Correct 111 ms 31456 KB Output is correct
31 Correct 206 ms 39888 KB Output is correct
32 Correct 127 ms 32664 KB Output is correct
33 Correct 129 ms 32712 KB Output is correct
34 Correct 127 ms 34060 KB Output is correct
35 Correct 145 ms 34556 KB Output is correct
36 Runtime error 2076 ms 1048576 KB Execution killed with signal 9
37 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 15188 KB Output is correct
2 Correct 7 ms 15188 KB Output is correct
3 Correct 7 ms 15188 KB Output is correct
4 Correct 7 ms 15108 KB Output is correct
5 Correct 7 ms 15180 KB Output is correct
6 Correct 7 ms 15188 KB Output is correct
7 Correct 7 ms 15188 KB Output is correct
8 Correct 7 ms 15188 KB Output is correct
9 Correct 8 ms 15188 KB Output is correct
10 Correct 9 ms 15180 KB Output is correct
11 Correct 7 ms 15200 KB Output is correct
12 Correct 9 ms 15188 KB Output is correct
13 Correct 7 ms 15180 KB Output is correct
14 Correct 7 ms 15188 KB Output is correct
15 Correct 7 ms 15184 KB Output is correct
16 Correct 7 ms 15188 KB Output is correct
17 Correct 7 ms 15180 KB Output is correct
18 Correct 7 ms 15188 KB Output is correct
19 Correct 7 ms 15188 KB Output is correct
20 Runtime error 1734 ms 1048576 KB Execution killed with signal 9
21 Halted 0 ms 0 KB -