제출 #78756

#제출 시각아이디문제언어결과실행 시간메모리
78756scanhexPark (BOI16_park)C++17
100 / 100
912 ms79596 KiB
#include <bits/stdc++.h>

using namespace std;
using nagai = long long;
using ll = long long;

struct circ
{
	 int x, y, r;
};

const int N = 2004;
nagai mx[N][N];

nagai sqr(nagai x)
{
	 return x * x;
}

int p[N];
void init()
{
	iota(p, p + N, 0);
}
bool trash = (init(), 0);
int getp(int x)
{
	 return p[x] == x ? x : p[x] = getp(p[x]);
}

void unite(int a, int b)
{
	p[getp(a)] = getp(b);
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int n, m;
	cin >> n >> m;
	int w, h;
	cin >> w >> h;
	vector<circ> mem(n);
	for (int i = 0; i < n; ++i)
		cin >> mem[i].x >> mem[i].y >> mem[i].r;
	for (int i = 0; i < n; ++i)
		for (int j = 0; j < i; ++j)
		{
			nagai L = 0, R = 2e9;
			while (R - L > 1)
			{
				 nagai M = (L + R) / 2;
				 // r[i] + r[j] + M <= hypot
				 if (sqr(mem[i].r + mem[j].r + M) <= sqr(mem[i].x - mem[j].x) + sqr(mem[i].y - mem[j].y))
					 L = M;
				 else
					 R = M;
			}
			mx[i][j] = mx[j][i] = L;
		}
	for (int i = 0; i < n; ++i)
	{
		nagai d = mem[i].y - mem[i].r;
		mx[i][n] = mx[n][i] = d;
		d = w - mem[i].x - mem[i].r;
		mx[i][n + 1] = mx[n + 1][i] = d;
		d = h - mem[i].y - mem[i].r;
		mx[i][n + 2] = mx[n + 2][i] = d;
		d = mem[i].x - mem[i].r;
		mx[i][n + 3] = mx[n + 3][i] = d;
	}
	vector<tuple<nagai, int, int>> edg;
	for (int i = 0; i < n + 4; ++i)
		for (int j = 0; j < min(i, n); ++j)
		{
			edg.emplace_back(mx[i][j], i, j);
		}
	sort(edg.begin(), edg.end());
	nagai oo = 1e18;
	vector<vector<nagai>> arr(4, vector<nagai>(4, oo));
	for (auto& x : edg)
	{
		unite(get<1>(x), get<2>(x));
		nagai mem = get<0>(x);
		for (int i = 0; i < 4; ++i)
			for (int j = 0; j < 4; ++j)
				if (getp(n + i) == getp(n + j) && arr[i][j] == oo)
					arr[i][j] = mem;
	}
	vector<vector<nagai>> go(4, vector<nagai>(4, oo));
	for (int i = 0; i < 4; ++i)
	{
		int j = (i + 1) % 4, k = (i + 2) % 4, l = (i + 3) % 4;
		go[i][j] = min(arr[i][j], min(arr[i][k], arr[i][l]));
		go[i][k] = min(min(arr[i][k], arr[j][l]), min(arr[i][l], arr[j][k]));
	}
	for (int i = 0; i < 4; ++i)
		go[i][(i + 3) % 4] = go[(i + 3) % 4][i];
	for (int i = 0; i < m; ++i)
	{
		 int r, e;
		 cin >> r >> e;
		 r *= 2;
		 --e;
		 for (int j = 0; j < 4; ++j)
			 if (go[e][j] >= r)
				 cout << j + 1;
		 cout << '\n';
	}
	return 0;
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...