제출 #1352907

#제출 시각아이디문제언어결과실행 시간메모리
1352907kl0989ePark (BOI16_park)C++20
100 / 100
590 ms17012 KiB
#include <bits/stdc++.h>
using namespace std;

//#pragma GCC optimize("Ofast")
//#pragma GCC optimize("unroll-loops")
//#pragma GCC target("avx,avx2,fma")

#define ll long long
#define fi first
#define se second
#define pb push_back
#define vi vector<int>
#define vl vector<ll>
#define pi pair<int, int>
#define pl pair<ll,ll>
#define all(x) (x).begin(),(x).end()

const int maxn=2010;

struct cyc {
	ll r,x,y;

	int dist(cyc o) {
		return floor(sqrt((x-o.x)*(x-o.x)+(y-o.y)*(y-o.y)))-r-o.r;
	}
};

vector<cyc> c(maxn);
vi dists(maxn);

int32_t main() {
    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(0);
    int n,m;
	cin >> n >> m;
	int w,h;
	cin >> w >> h;
	for (int i=0; i<n; i++) {
		cin >> c[i].x >> c[i].y >> c[i].r;
	}
	vector<vi> maxd(4,vi(4,1e9));
	priority_queue<pi,vector<pi>,greater<pi>> q;
	for (int i=0; i<n; i++) {
		dists[i]=c[i].x-c[i].r;
		q.push({dists[i],i});
	}
	while (q.size()) {
		auto [d,cur]=q.top();
		q.pop();
		if (dists[cur]!=d) {
			continue;
		}
		for (int i=0; i<n; i++) {
			if (max(d,c[cur].dist(c[i]))<dists[i]) {
				dists[i]=max(d,c[cur].dist(c[i]));
				q.push({dists[i],i});
			}
		}
		maxd[0][1]=min(maxd[0][1],max(d,(int)(c[cur].y-c[cur].r)));
		maxd[0][2]=min(maxd[0][2],max(d,(int)(c[cur].y-c[cur].r)));
		maxd[0][3]=min(maxd[0][3],max(d,(int)(c[cur].y-c[cur].r)));
		maxd[0][2]=min(maxd[0][2],max(d,(int)(w-c[cur].x-c[cur].r)));
		maxd[0][3]=min(maxd[0][3],max(d,(int)(w-c[cur].x-c[cur].r)));
		maxd[1][2]=min(maxd[1][2],max(d,(int)(w-c[cur].x-c[cur].r)));
		maxd[1][3]=min(maxd[1][3],max(d,(int)(w-c[cur].x-c[cur].r)));
		maxd[0][3]=min(maxd[0][3],max(d,(int)(h-c[cur].y-c[cur].r)));
		maxd[1][3]=min(maxd[1][3],max(d,(int)(h-c[cur].y-c[cur].r)));
		maxd[2][3]=min(maxd[2][3],max(d,(int)(h-c[cur].y-c[cur].r)));
	}
	for (int i=0; i<n; i++) {
		dists[i]=c[i].y-c[i].r;
		q.push({dists[i],i});
	}
	while (q.size()) {
		auto [d,cur]=q.top();
		q.pop();
		if (dists[cur]!=d) {
			continue;
		}
		for (int i=0; i<n; i++) {
			if (max(d,c[cur].dist(c[i]))<dists[i]) {
				dists[i]=max(d,c[cur].dist(c[i]));
				q.push({dists[i],i});
			}
		}
		maxd[0][1]=min(maxd[0][1],max(d,(int)(w-c[cur].x-c[cur].r)));
		maxd[1][2]=min(maxd[1][2],max(d,(int)(w-c[cur].x-c[cur].r)));
		maxd[1][3]=min(maxd[1][3],max(d,(int)(w-c[cur].x-c[cur].r)));
		maxd[0][1]=min(maxd[0][1],max(d,(int)(h-c[cur].y-c[cur].r)));
		maxd[0][2]=min(maxd[0][2],max(d,(int)(h-c[cur].y-c[cur].r)));
		maxd[1][3]=min(maxd[1][3],max(d,(int)(h-c[cur].y-c[cur].r)));
		maxd[2][3]=min(maxd[2][3],max(d,(int)(h-c[cur].y-c[cur].r)));
	}
	for (int i=0; i<n; i++) {
		dists[i]=w-c[i].x-c[i].r;
		q.push({dists[i],i});
	}
	while (q.size()) {
		auto [d,cur]=q.top();
		q.pop();
		if (dists[cur]!=d) {
			continue;
		}
		for (int i=0; i<n; i++) {
			if (max(d,c[cur].dist(c[i]))<dists[i]) {
				dists[i]=max(d,c[cur].dist(c[i]));
				q.push({dists[i],i});
			}
		}
		maxd[0][2]=min(maxd[0][2],max(d,(int)(h-c[cur].y-c[cur].r)));
		maxd[1][2]=min(maxd[1][2],max(d,(int)(h-c[cur].y-c[cur].r)));
		maxd[2][3]=min(maxd[2][3],max(d,(int)(h-c[cur].y-c[cur].r)));
	}
	for (int i=0; i<4; i++) {
		for (int j=0; j<4; j++) {
			maxd[i][j]=min(maxd[i][j],maxd[j][i]);
		}
	}
	int num,r;
	for (int i=0; i<m; i++) {
		cin >> r >> num;
		num--;
		r*=2;
		for (int i=0; i<4; i++) {
			if (r<=maxd[num][i]) {
				cout << i+1;
			}
		}
		cout << '\n';
	}
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...