Submission #1364893

#TimeUsernameProblemLanguageResultExecution timeMemory
1364893xorshiftMars (APIO22_mars)C++20
14 / 100
8 ms3424 KiB
#include <bits/stdc++.h>
using namespace std;
using vint = vector<int>;
using ll = long long;
using vll = vector<ll>;
using pint = pair<int, int>;
using vpint = vector<pint>;
using pll = pair<ll, ll>;
using vpll = vector<pll>;
using pill = pair<int, ll>;
using vpill = vector<pill>;
using plli = pair<ll, int>;
using vplli = vector<plli>;
#define fi first
#define se second
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
#define rep(i, n) for (int i = 0; i < (n); i++)
#define rrep(i, n) for(int i = (n)-1; i >= 0; --i)
#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define RFOR(i, a, b) for(int i = (a)-1; i >= (b); --i)

const int WIN_SIZE = 100;
const int ARR_SIZE = 40;

struct DSU {
	vint p, size; int groups;
	DSU(int n): p(n), size(n, 1), groups(n) {
		iota(all(p), 0);
	}
	int find(int v) {
		if (p[v] == v) return v;
		return p[v] = find(p[v]);
	}
	void unite(int u, int v) {
		u = find(u), v = find(v);
		if (u == v) return;
		if (size[u] < size[v]) swap(u, v);
		p[v] = u; size[u] += size[v]; groups--;
	}
};

string process(vector<vector<string>> a, int i, int j, int k, int n) {
    int m = 2*(n-k-1);
	if (k == n-1) {
		int box_size = 2*n+1;

		string res(WIN_SIZE, '0');
		rep(y, 3) rep(x, 3) {
			if (x == 2 && y == 2) {
				int sm_box_size = box_size-2;
				rep(y2, sm_box_size) rep(x2, sm_box_size) {
					res[(x+x2) + box_size*(y+y2)] = a[y][x][x2 + sm_box_size*y2];
				}
			}
			else if (x == 2) {
				int sm_line_size = box_size-2;
				rep(x2, sm_line_size) res[(x+x2) + box_size*y] = a[y][x][x2];
			}
			else if (y == 2) {
				int sm_line_size = box_size-2;
				rep(y2, sm_line_size) res[x + box_size*(y+y2)] = a[y][x][y2];
			}
			else {
				res[x + box_size*y] = a[y][x][0];
			}
		}
		DSU g_counter(box_size*box_size);
		int w_counter = 0;

		rep(x, box_size) rep(y, box_size) {
			int value = res[x + y*box_size] - '0';
			if (value) {
				if (x != 0) {
					int px_val = res[x-1 + y*box_size] - '0';
					if (px_val) g_counter.unite(x+y*box_size, (x-1) + y*box_size);
				}
				if (y != 0) {
					int py_val = res[x + (y-1)*box_size] - '0';
					if (py_val) g_counter.unite(x+y*box_size, x + (y-1)*box_size);
				}
			} else w_counter++;
		}
		int val = g_counter.groups - w_counter;
		string sval = bitset<100>(val).to_string();
		reverse(all(sval));
		return sval;
	} else {
		if (j == m && i == m) {
			int box_size = 2*n+1-m;
			string res(WIN_SIZE, '0');
			rep(y, 3) rep(x, 3) {
				if (x == 2 && y == 2) {
					int sm_box_size = box_size-2;
					rep(y2, sm_box_size) rep(x2, sm_box_size) {
						res[(x+x2) + box_size*(y+y2)] = a[y][x][x2 + sm_box_size*y2];
					}
				}
				else if (x == 2) {
					int sm_line_size = box_size-2;
					rep(x2, sm_line_size) res[(x+x2) + box_size*y] = a[y][x][x2];
				}
				else if (y == 2) {
					int sm_line_size = box_size-2;
					rep(y2, sm_line_size) res[x + box_size*(y+y2)] = a[y][x][y2];
				}
				else {
					res[x + box_size*y] = a[y][x][0];
				}
			}
			return res;
		}
		else if (j == m) {
			int line_size = 2*n-m+1;
			string res(WIN_SIZE, '0');
			res[0] = a[0][0][0]; res[1] = a[0][1][0];
			int sm_line_size = line_size-2;
			rep(x, sm_line_size) res[2+x] = a[0][2][x];
			return res;
		}
		else if (i == m) {
			int line_size = 2*n-m+1;
			string res(WIN_SIZE, '0');
			res[0] = a[0][0][0]; res[1] = a[1][0][0];
			int sm_line_size = line_size-2;
			rep(y, sm_line_size) res[2+y] = a[2][0][y];
			return res;
		}
		else {
			return a[0][0];
		}
	}
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...