This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
/** I can do this all day **/
#pragma GCC optimize("O2")
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
#define all(x) (x).begin(),(x).end()
#define F first
#define S second
#define Mp make_pair
#define SZ(x) (int)x.size()
#define fast_io ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define file_io freopen("in.txt" , "r+" , stdin) ; freopen("out.txt" , "w+" , stdout);
const int N = 1e6 + 10;
const ll mod = 1e9 + 7;
const ll mod2 = 998244353;
const ll inf = 8e18;
const int LOG = 22;
const ld one = 1.;
const ld eps = 1e-12;
ll pw(ll a , ll b, ll M) { return (!b ? 1 : (b & 1 ? (a * pw(a * a % M, b / 2, M)) % M : pw(a * a % M, b / 2, M))); }
ll n, m, w, h, X[N], Y[N], R[N], par[N], sz[N];
int get(int x)
{
return (x == par[x]? x : par[x] = get(par[x]));
}
void unify(int v, int u)
{
v = get(v), u = get(u);
if(v == u) return;
if(sz[u] > sz[v]) swap(u, v);
par[u] = v;
sz[v] += sz[u];
}
pair < pll, int > Q[N];
vector < pair < ld, pll > > E;
vector < int > Ans[N];
bool cmp(pair < pll, ll > a, pair < pll, ll > b)
{
return a.F < b.F;
}
int ok(int a, int b)
{
a += n;
b += n;
return (get(a) == get(b));
}
int can(int a, int b)
{
if(a == b) return 1;
if(a > b) swap(a, b);
if(a == 1 && b == 2)
{
return ((ok(1, 2) || ok(2, 4) || ok(2, 3)) == 0);
}
if(a == 1 && b == 3)
{
return ((ok(1, 2) || ok(1, 3) || ok(2, 4) || ok(3, 4)) == 0);
}
if(a == 1 && b == 4)
{
return ((ok(1, 2) || ok(1, 3) || ok(1, 4)) == 0);
}
if(a == 2 && b == 3)
{
return ((ok(1, 3) || ok(2, 3) || ok(4, 3)) == 0);
}
if(a == 2 && b == 4)
{
return ((ok(1, 3) || ok(1, 4) || ok(2, 3) || ok(2, 4)) == 0);
}
else
{
return ((ok(1, 4) || ok(2, 4) || ok(3, 4)) == 0);
}
}
int main()
{
for(int i = 0; i < N; i ++) sz[i] = 1, par[i] = i;
scanf("%lld%lld%lld%lld", &n, &m, &w, &h);
for(int i = 1; i <= n; i ++)
{
scanf("%lld%lld%lld", &X[i], &Y[i], &R[i]);
E.push_back(Mp(X[i] - R[i], Mp(n + 1, i)));
E.push_back(Mp(Y[i] - R[i], Mp(n + 2, i)));
E.push_back(Mp(w - X[i] - R[i], Mp(n + 3, i)));
E.push_back(Mp(h - Y[i] - R[i], Mp(n + 4, i)));
for(int j = 1; j < i; j ++)
{
ll dx = abs(X[i] - X[j]), dy = abs(Y[i] - Y[j]);
ll dist = sqrt(dx * dx + dy * dy) - one * R[i] - one * R[j];
E.push_back(Mp(dist, Mp(i, j)));
}
}
sort(all(E));
for(int i = 1; i <= m; i ++)
{
scanf("%lld%lld", &Q[i].F.F, &Q[i].F.S);
Q[i].F.F *= 2;
Q[i].S = i;
}
sort(Q + 1, Q + m + 1, cmp);
int last = 0;
for(int i = 1; i <= m; i ++)
{
///printf("i = %d Q.F : %lld Q.S : %lld\n", i, Q[i].F.F, Q[i].F.S);
while(last < SZ(E) && (one * Q[i].F.F - E[last].F) > eps)
{
unify(E[last].S.F, E[last].S.S);
last ++;
}
for(int j = 1; j <= 4; j ++)
{
if(can(Q[i].F.S, j))
{
Ans[Q[i].S].push_back(j);
}
}
}
for(int i = 1; i <= m; i ++)
{
for(auto x : Ans[i])
{
printf("%d", x);
}
printf("\n");
}
return 0;
}
/** test corner cases(n = 1?) watch for overflow or minus indices **/
Compilation message (stderr)
park.cpp: In function 'int main()':
park.cpp:97:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
97 | scanf("%lld%lld%lld%lld", &n, &m, &w, &h);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
park.cpp:100:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
100 | scanf("%lld%lld%lld", &X[i], &Y[i], &R[i]);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
park.cpp:115:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
115 | scanf("%lld%lld", &Q[i].F.F, &Q[i].F.S);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |