Submission #591011

# Submission time Handle Problem Language Result Execution time Memory
591011 2022-07-06T17:41:15 Z Temmie Wombats (IOI13_wombats) C++17
28 / 100
1618 ms 17560 KB
#include "wombats.h"
#include <bits/stdc++.h>

constexpr const int BS = 30;

int r, c;
std::vector <std::vector <int>> h, v;

struct Block {
	
	int sc = -1, ec = -1;
	std::vector <std::vector <int>> con;
	
	Block(bool empty = false) :
	con(!empty * c, std::vector <int> (c, 1 << 30))
	{ }
	
	void update(int _sc, int _ec) {
		sc = _sc;
		ec = _ec;
		for (int i = 0; i < c; i++) {
			for (int j = 0; j < c; j++) {
				con[i][j] = 1 << 30;
			}
		}
		for (int j = 0; j < c; j++) {
			con[j][j] = 0;
		}
		for (int i = ec; i >= sc; i--) {
			std::vector <std::vector <int>> nxt(c, std::vector <int> (c, 1 << 30));
			if (i == ec) {
				for (int j = 0; j < c; j++) {
					nxt[j][j] = 0;
				}
			}
			for (int j = 0; j < c; j++) {
				if (i != ec) {
					for (int k = 0; k < c; k++) {
						nxt[j][k] = std::min(nxt[j][k], con[j][k] + v[i][j]);
					}
				}
				if (j) {
					for (int k = 0; k < c; k++) {
						nxt[j][k] = std::min(nxt[j][k], nxt[j - 1][k] + h[i][j - 1]);
					}
				}
			}
			for (int j = c - 1; j >= 0; j--) {
				if (j + 1 < c) {
					for (int k = 0; k < c; k++) {
						nxt[j][k] = std::min(nxt[j][k], nxt[j + 1][k] + h[i][j]);
					}
				}
			}
			std::swap(con, nxt);
		}
	}
	
	friend Block merge(const Block& upper, const Block& lower) {
		if (!upper.con.empty() && lower.con.empty()) {
			return upper;
		}
		if (upper.con.empty()) {
			assert(lower.con.empty());
			return Block(true);
		}
		Block res;
		res.sc = upper.sc;
		res.ec = lower.ec;
		std::vector <std::vector <int>> ine(c, std::vector <int> (c, 1 << 30));
		{
			for (int j = 0; j < c; j++) {
				for (int k = 0; k < c; k++) {
					ine[j][k] = std::min(ine[j][k], lower.con[j][k] + v[upper.ec][j]);
				}
				if (j) {
					for (int k = 0; k < c; k++) {
						ine[j][k] = std::min(ine[j][k], ine[j - 1][k] + h[upper.ec][j - 1]);
					}
				}
			}
			for (int j = c - 1; j >= 0; j--) {
				if (j + 1 < c) {
					for (int k = 0; k < c; k++) {
						ine[j][k] = std::min(ine[j][k], ine[j + 1][k] + h[upper.ec][j]);
					}
				}
			}
		}
		for (int i = 0; i < c; i++) {
			for (int j = 0; j < c; j++) {
				for (int k = 0; k < c; k++) {
					res.con[i][k] = std::min(res.con[i][k], upper.con[i][j] + ine[j][k]);
				}
			}
		}
		return res;
	}
	
};

struct Seg {
	
	int size;
	std::vector <Block> v;
	
	Seg(int s) {
		size = 1;
		while (size < s) {
			size <<= 1;
		}
		v.resize(size << 1, Block(true));
		build(0, 0, size);
	}
	
	void build(int now, int li, int ri) {
		if (!(ri - li - 1)) {
			if (li < r) {
				v[now] = Block();
				v[now].update(li * BS, std::min(r - 1, (li + 1) * BS - 1));
			}
			return;
		}
		int mid = (li + ri) >> 1;
		build(now * 2 + 1, li, mid);
		build(now * 2 + 2, mid, ri);
		v[now] = merge(v[now * 2 + 1], v[now * 2 + 2]);
	}
	
	void update(int ind) {
		update(ind, 0, 0, size);
	}
	
	void update(int ind, int now, int li, int ri) {
		if (!(ri - li - 1)) {
			v[now].update(ind * BS, std::min(r - 1, (ind + 1) * BS - 1));
			return;
		}
		int mid = (li + ri) >> 1;
		if (ind < mid) {
			update(ind, now * 2 + 1, li, mid);
		} else {
			update(ind, now * 2 + 2, mid, ri);
		}
		v[now] = merge(v[now * 2 + 1], v[now * 2 + 2]);
	}
	
};

Seg* seg;

void init(int R, int C, int H[5000][200], int V[5000][200]) {
	r = R;
	c = C;
	h.resize(r, std::vector <int> (c - 1));
	v.resize(r - 1, std::vector <int> (c));
	for (int i = 0; i < r; i++) {
		for (int j = 0; j < c; j++) {
			if (j < c - 1) {
				h[i][j] = H[i][j];
			}
			if (i < r - 1) {
				v[i][j] = V[i][j];
			}
		}
	}
	seg = new Seg((r + BS - 1) / BS);
}

void changeH(int p, int q, int w) {
	h[p][q] = w;
	seg->update(p / BS);
}

void changeV(int p, int q, int w) {
	v[p][q] = w;
	seg->update(p / BS);
}

int escape(int v1, int v2) {
	return seg->v[0].con[v1][v2];
}

Compilation message

grader.c: In function 'int main()':
grader.c:15:6: warning: variable 'res' set but not used [-Wunused-but-set-variable]
   15 |  int res;
      |      ^~~
# Verdict Execution time Memory Grader output
1 Runtime error 8 ms 9208 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 340 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 1 ms 340 KB Output is correct
8 Correct 1 ms 340 KB Output is correct
9 Correct 1 ms 340 KB Output is correct
10 Correct 1 ms 340 KB Output is correct
11 Correct 63 ms 1312 KB Output is correct
12 Correct 1 ms 340 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 314 ms 920 KB Output is correct
2 Correct 332 ms 1008 KB Output is correct
3 Correct 323 ms 1020 KB Output is correct
4 Correct 350 ms 1016 KB Output is correct
5 Correct 333 ms 1008 KB Output is correct
6 Correct 0 ms 212 KB Output is correct
7 Correct 1 ms 308 KB Output is correct
8 Correct 0 ms 212 KB Output is correct
9 Correct 1618 ms 1000 KB Output is correct
10 Correct 1 ms 212 KB Output is correct
# Verdict Execution time Memory Grader output
1 Runtime error 12 ms 17516 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 314 ms 924 KB Output is correct
2 Correct 321 ms 984 KB Output is correct
3 Correct 322 ms 1012 KB Output is correct
4 Correct 335 ms 1020 KB Output is correct
5 Correct 315 ms 1008 KB Output is correct
6 Runtime error 13 ms 17492 KB Execution killed with signal 11
7 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 304 ms 924 KB Output is correct
2 Correct 317 ms 992 KB Output is correct
3 Correct 324 ms 1012 KB Output is correct
4 Correct 335 ms 1024 KB Output is correct
5 Correct 326 ms 980 KB Output is correct
6 Runtime error 13 ms 17560 KB Execution killed with signal 11
7 Halted 0 ms 0 KB -