Submission #591552

# Submission time Handle Problem Language Result Execution time Memory
591552 2022-07-07T14:55:14 Z Temmie Wombats (IOI13_wombats) C++17
21 / 100
434 ms 96644 KB
#include "wombats.h"
#include <bits/stdc++.h>

constexpr const int BS = 20;
constexpr const int mxr = 5000;
constexpr const int mxc = 200;
constexpr const int mxv = 0b01111111;

int r, c;
unsigned int h[mxr][mxc];
unsigned int v[mxr][mxc];

struct Block {
	
	int sc = -1, ec = -1;
	unsigned int con[mxc][mxc];
	
	void update(int _sc, int _ec) {
		sc = _sc;
		ec = _ec;
		memset(con, mxv, sizeof(con));
		for (int j = 0; j < c; j++) {
			con[j][j] = 0;
		}
		static unsigned int nxt[mxc][mxc];
		for (int i = ec; i >= sc; i--) {
			memset(nxt, mxv, sizeof(nxt));
			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]);
					}
				}
			}
			memcpy(con, nxt, sizeof(nxt));
		}
	}
	
	void merge(const Block* upper, const Block* lower) {
		if (upper && !lower) {
			sc = upper->sc;
			ec = upper->ec;
			memcpy(con, upper->con, sizeof(upper->con));
			return;
		}
		if (!upper) {
			assert(!lower);
			return;
		}
		sc = upper->sc;
		ec = lower->ec;
		static unsigned int bes[mxc][mxc];
		memset(con, mxv, sizeof(con));
		memset(bes, mxv, sizeof(bes));
		for (int d = -c; d <= c; d++) {
			for (int i = std::max(0, -d); i + std::max(0, d) < c; i++) {
				int j = i + d;
				int l = 0;
				int r = c - 1;
				if (j && con[i][j - 1] < 1000) {
					l = con[i][j - 1];
				}
				if (i + 1 < c && con[i + 1][j] < 1000) {
					r = con[i + 1][j];
				}
				for (int k = l; k <= r; k++) {
					if (upper->con[i][k] + lower->con[k][j] + v[upper->ec][k] < con[i][j]) {
						con[i][j] = upper->con[i][k] + lower->con[k][j] + v[upper->ec][k];
						bes[i][j] = k;
					}
				}
			}
		}
	}
	
};

struct Seg {
	
	int size;
	std::vector <Block*> v;
	
	Seg(int s) {
		size = 1;
		while (size < s) {
			size <<= 1;
		}
		v.resize(size << 1, nullptr);
		build(0, 0, size);
	}
	
	void build(int now, int li, int ri) {
		if (!(ri - li - 1)) {
			if (li * BS < r) {
				v[now] = new 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);
		if (v[now * 2 + 1]) {
			v[now] = new Block();
			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);
		}
		if (v[now]) {
			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;
	memcpy(h, H, sizeof(h));
	memcpy(v, V, sizeof(v));
	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 Correct 218 ms 92624 KB Output is correct
2 Correct 235 ms 92648 KB Output is correct
3 Correct 314 ms 95000 KB Output is correct
4 Correct 224 ms 92684 KB Output is correct
5 Correct 217 ms 92704 KB Output is correct
6 Correct 6 ms 8412 KB Output is correct
7 Correct 5 ms 8404 KB Output is correct
8 Correct 5 ms 8372 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 5 ms 8404 KB Output is correct
2 Correct 5 ms 8372 KB Output is correct
3 Correct 5 ms 8404 KB Output is correct
4 Correct 5 ms 8404 KB Output is correct
5 Correct 5 ms 8400 KB Output is correct
6 Correct 5 ms 8528 KB Output is correct
7 Correct 5 ms 8480 KB Output is correct
8 Correct 5 ms 8508 KB Output is correct
9 Correct 5 ms 8404 KB Output is correct
10 Correct 5 ms 8508 KB Output is correct
11 Correct 73 ms 10184 KB Output is correct
12 Correct 6 ms 8404 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 371 ms 10584 KB Output is correct
2 Runtime error 434 ms 20812 KB Execution killed with signal 11
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 226 ms 96568 KB Output is correct
2 Incorrect 221 ms 96644 KB Output isn't correct
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 386 ms 10460 KB Output is correct
2 Runtime error 421 ms 20816 KB Execution killed with signal 11
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 397 ms 10456 KB Output is correct
2 Runtime error 424 ms 20812 KB Execution killed with signal 11
3 Halted 0 ms 0 KB -