Submission #1208658

#TimeUsernameProblemLanguageResultExecution timeMemory
1208658k1r1t0Hexagonal Territory (APIO21_hexagon)C++20
47 / 100
803 ms897888 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

const int MOD = (int)(1e9+7);
const int INV6 = (MOD + 1) / 6;
const int T = 2100;

vector<array<int, 2>> d = {{0, 1}, {1, 0}, {1, -1}, {0, -1}, {-1, 0}, {-1, 1}};
int a[T + T][T + T];

void dfs(int i, int j) {
	if (a[i][j] != -1)
		return;
	a[i][j] = 0;
	for (auto [dx, dy] : d)
		if (0 <= i + dx && 0 <= j + dy && i + dx < T + T && j + dy < T + T)
			dfs(i + dx, j + dy);
}

int draw_territory(int N, int A, int B, vector<int> D, vector<int> L) {
	if (N == 3) {
		ll t = L[0];
		return ((t + 1) * A % MOD + t * (t + 1) / 2 % MOD * (A + B) % MOD + t * (t + 1) % MOD * (2 * t + 1) % MOD * INV6 % MOD * B % MOD) % MOD;
	}
	ll sum = 0;
	for (auto x : L)
		sum += x;
	if (sum <= 2000) {
		ll x = 0, y = 0;
		for (int i = 0; i < T + T; i++)
		for (int j = 0; j < T + T; j++)
			a[i][j] = -1;
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < L[i]; j++) {
				x += d[D[i] - 1][0];
				y += d[D[i] - 1][1];
				a[T + x][T + y] = 1;
			}
		}
		dfs(0, 0);
		for (int i = 0; i < T + T; i++)
		for (int j = 0; j < T + T; j++)
			if (a[i][j] == 1)
				a[i][j] = -1;
		a[T][T] = 0;
		queue<array<int, 2>> qq;
		qq.push({T, T});
		while (!qq.empty()) {
			auto [i, j] = qq.front(); qq.pop();
			for (auto [dx, dy] : d)
				if (0 <= i + dx && 0 <= j + dy && i + dx < T + T && j + dy < T + T && a[i + dx][j + dy] == -1) {
					a[i + dx][j + dy] = a[i][j] + 1;
					qq.push({i + dx, j + dy});
				}
		}
		int ans = A;
		for (int i = 0; i < T + T; i++)
		for (int j = 0; j < T + T; j++)
			if (a[i][j] > 0)
				(ans += (A + 1ll * B * a[i][j]) % MOD) %= MOD;
		return ans;
	}
	ll s = 0, b = 0, x = 0, y = 0;
	for (int i = 0; i < N; i++) {
		b += L[i];
		ll nx = x + d[D[i] - 1][0] * L[i];
		ll ny = y + d[D[i] - 1][1] * L[i];
		s += x * ny - y * nx;
		x = nx, y = ny;
	}
	s = abs(s) / 2;
	ll p = s - b / 2 + 1;
	return A * ((p + b) % MOD) % MOD;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...