Submission #591170

# Submission time Handle Problem Language Result Execution time Memory
591170 2022-07-06T23:59:45 Z Temmie Wombats (IOI13_wombats) C++17
28 / 100
3597 ms 262144 KB
#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math,O3")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx2,tune=native")

#include "wombats.h"
#include <bits/stdc++.h>

constexpr const int BS = 6;
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 ine[mxc][mxc];
		memset(con, mxv, sizeof(con));
		if (ec - sc < c) {
			for (int j = 0; j < c; j++) {
				for (int k = 0; k < c; k++) {
					con[j][k] = std::min(con[j][k], lower->con[j][k] + v[upper->ec][j]);
				}
				if (j) {
					for (int k = 0; k < c; k++) {
						con[j][k] = std::min(con[j][k], con[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++) {
						con[j][k] = std::min(con[j][k], con[j + 1][k] + h[upper->ec][j]);
					}
				}
			}
			for (int i = upper->ec - 1; i >= sc; i--) {
				memset(ine, mxv, sizeof(ine));
				for (int j = 0; j < c; j++) {
					if (i != ec) {
						for (int k = 0; k < c; k++) {
							ine[j][k] = std::min(ine[j][k], con[j][k] + v[i][j]);
						}
					}
					if (j) {
						for (int k = 0; k < c; k++) {
							ine[j][k] = std::min(ine[j][k], ine[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++) {
							ine[j][k] = std::min(ine[j][k], ine[j + 1][k] + h[i][j]);
						}
					}
				}
				memcpy(con, ine, sizeof(ine));
			}
			return;
		}
		memset(ine, mxv, sizeof(ine));
		{
			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++) {
					con[i][k] = std::min(con[i][k], upper->con[i][j] + ine[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 Runtime error 159 ms 262144 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 5 ms 8404 KB Output is correct
2 Correct 6 ms 8404 KB Output is correct
3 Correct 4 ms 8404 KB Output is correct
4 Correct 7 ms 9556 KB Output is correct
5 Correct 5 ms 9556 KB Output is correct
6 Correct 6 ms 9572 KB Output is correct
7 Correct 6 ms 9600 KB Output is correct
8 Correct 5 ms 9556 KB Output is correct
9 Correct 6 ms 9560 KB Output is correct
10 Correct 6 ms 9556 KB Output is correct
11 Correct 81 ms 10492 KB Output is correct
12 Correct 6 ms 9612 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 690 ms 14548 KB Output is correct
2 Correct 791 ms 14548 KB Output is correct
3 Correct 722 ms 14544 KB Output is correct
4 Correct 727 ms 14612 KB Output is correct
5 Correct 474 ms 14560 KB Output is correct
6 Correct 5 ms 8404 KB Output is correct
7 Correct 4 ms 8404 KB Output is correct
8 Correct 5 ms 8404 KB Output is correct
9 Correct 3597 ms 14560 KB Output is correct
10 Correct 4 ms 8404 KB Output is correct
# Verdict Execution time Memory Grader output
1 Runtime error 149 ms 262144 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 702 ms 14544 KB Output is correct
2 Correct 732 ms 14548 KB Output is correct
3 Correct 724 ms 14548 KB Output is correct
4 Correct 779 ms 14548 KB Output is correct
5 Correct 517 ms 14560 KB Output is correct
6 Runtime error 148 ms 262144 KB Execution killed with signal 9
7 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 722 ms 14556 KB Output is correct
2 Correct 775 ms 14588 KB Output is correct
3 Correct 771 ms 14548 KB Output is correct
4 Correct 768 ms 14548 KB Output is correct
5 Correct 482 ms 14548 KB Output is correct
6 Runtime error 166 ms 262144 KB Execution killed with signal 9
7 Halted 0 ms 0 KB -