#include<bits/stdc++.h>
using namespace std;
#define int long long
#define double long double
struct dsu {
int n;
vector<int> r, s;
dsu(int n) {
this->n=n;
r.reserve(n+1);
for (int i = 0; i < n; ++i) r[i]=i;
s.assign(n+1, 1);
}
int find(int a) {
if (a==r[a]) return a;
return r[a]=find(r[a]);
}
void unite(int a, int b) {
a=find(a), b=find(b);
if (s[a]<s[b]) swap(a, b);
r[b]=a; s[a]+=s[b];
}
};
struct visitor {
int r, e, i;
visitor(int a, int b, int c) { r=a, e=b, i=c; }
};
struct tree {
int x, y, r, i;
tree(int a) { x=y=r=0; i=a; }
tree(int a, int b, int c, int d) { x=a, y=b, r=c, i=d; }
};
double dist(tree a, tree b) { return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y))-a.r-b.r; }
bool rcomp(visitor a, visitor b) { return a.r < b.r; }
signed main() {
cin.tie(0)->sync_with_stdio(false);
int n, m, w, h;
cin >> n >> m >> w >> h;
vector<tree> trees;
for (int i = 0; i < n; ++i) {
int x, y, r;
cin >> x >> y >> r;
trees.emplace_back(x, y, r, i);
}
int L=n, R=n+1, B=n+2, T=n+3;
priority_queue<pair<int, pair<int, int>>> pq;
for (int i = 0; i < n; ++i) {
pq.push({trees[i].r-trees[i].x, {i, L}});
pq.push({trees[i].x+trees[i].r-w, {i, R}});
pq.push({trees[i].y+trees[i].r-h, {i, T}});
pq.push({trees[i].r-trees[i].y, {i, B}});
for (int j = i+1; j < n; ++j) {
pq.push({-dist(trees[i], trees[j]), {i, j}});
}
}
vector<visitor> visitors;
for (int i = 0; i < m; ++i) {
int r, e;
cin >> r >> e;
visitors.emplace_back(r, e, i);
} sort(visitors.begin(), visitors.end(), rcomp);
dsu uf(n+4);
vector<int> ans(m, 0);
for (int i = 0; i < m; ++i) {
int r=visitors[i].r;
while (-pq.top().first<2*r) {
uf.unite(pq.top().second.first, pq.top().second.second);
pq.pop();
}
int e=visitors[i].e, j=visitors[i].i;
if (e==1) {
if (uf.find(L)==uf.find(B)) ans[j]=1;
else {
ans[j]=15;
if (uf.find(L)==uf.find(T) || uf.find(L)==uf.find(R)) ans[j]-=8;
if (uf.find(T)==uf.find(R) || uf.find(L)==uf.find(R) || uf.find(B)==uf.find(T)) ans[j]-=4;
if (uf.find(B)==uf.find(R) || uf.find(B)==uf.find(T)) ans[j]-=2;
}
} else if (e==2) {
if (uf.find(R)==uf.find(B)) ans[j]=2;
else {
ans[j]=15;
if (uf.find(T)==uf.find(R) || uf.find(L)==uf.find(R)) ans[j]-=4;
if (uf.find(L)==uf.find(T) || uf.find(L)==uf.find(R) || uf.find(B)==uf.find(T)) ans[j]-=8;
if (uf.find(B)==uf.find(L) || uf.find(B)==uf.find(T)) ans[j]-=1;
}
} else if (e==3) {
if (uf.find(R)==uf.find(T)) ans[j]=4;
else {
ans[j]=15;
if (uf.find(B)==uf.find(R) || uf.find(L)==uf.find(R)) ans[j]-=2;
if (uf.find(B)==uf.find(L) || uf.find(L)==uf.find(R) || uf.find(B)==uf.find(T)) ans[j]-=1;
if (uf.find(L)==uf.find(T) || uf.find(B)==uf.find(T)) ans[j]-=8;
}
} else {
if (uf.find(L)==uf.find(T)) ans[j]=8;
else {
ans[j]=15;
if (uf.find(L)==uf.find(B) || uf.find(L)==uf.find(R)) ans[j]-=1;
if (uf.find(B)==uf.find(R) || uf.find(L)==uf.find(R) || uf.find(B)==uf.find(T)) ans[j]-=2;
if (uf.find(T)==uf.find(R) || uf.find(B)==uf.find(T)) ans[j]-=4;
}
}
}
for (int i = 0; i < m; ++i) {
for (int j = 0; j < 4; ++j) {
if (ans[i]&(1<<j)) cout << j+1;
} cout << '\n';
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |