# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1003509 | sano | Park (BOI16_park) | C++14 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<iostream>
#include<vector>
#include<queue>
#include<string>
#include<fstream>
#include<algorithm>
#include <iomanip>
#include<map>
#include <set>
#include <unordered_map>
#include <stack>
#include <unordered_set>
#define ll long long
#define For(i, n) for(ll i = 0; i < (ll)n; i++)
#define ffor(i, a, n) for(ll i = (ll)a; i < (ll)n; i++)
#define rfor(i, n) for(ll i = (ll)n; i >= (ll)0; i--)
#define rffor(i, a, n) for(ll i = (ll)n; i >= (ll)a; i--)
#define vec vector
#define ff first
#define ss second
#define pb push_back
#define shit short ll
#define pii pair<ll, ll>
#define NEK 1000000000
#define mod1 1000000007
#define mod2 1000000009
#define rsz resize
#define prv1 43
#define prv2 47
#define D 8
using namespace std;
vec<int> o;
double dist(pii a, pii b) {
return sqrt(abs(a.ff - b.ff) * abs(a.ff - b.ff) + abs(a.ss - b.ss) * abs(a.ss - b.ss));
}
struct strom {
ll x, y, r;
};
struct hrana {
ll x, y;
double w;
bool operator<(const hrana& other) const {
return w > other.w;
}
};
struct clovek {
ll r, e, ind;
bool operator<(const clovek& other) const {
return r < other.r;
}
};
int otec(int x) {
if (o[x] < 0) return x;
o[x] = otec(o[x]);
return o[x];
}
bool spoj(int a, int b) {
if (otec(a) == otec(b)) return true;
o[otec(b)] = otec(a);
return true;
}
bool je(int a, int b) {
return otec(a) == otec(b);
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL);
ll n, m, w, h;
cin >> n >> m >> w >> h;
vec<strom> s;
For(i, n) {
ll x, y, r;
cin >> x >> y >> r;
s.push_back({ x, y, r });
}
vec<hrana> p;
For(i, n) {
For(j, n) {
if (i == j) continue;
p.push_back({ i, j, { double((dist({s[i].x, s[i].y}, {s[j].x, s[j].y}) - s[i].r - s[j].r) / 2) } });
}
}
For(i, n) {
p.push_back({ i, n, double((s[i].y - s[i].r) / 2) });
p.push_back({ i, n + 1, double((w - s[i].x - s[i].r) / 2) });
p.push_back({ i, n + 2, double((h - s[i].y - s[i].r) / 2) });
p.push_back({ i, n + 3, double((s[i].x - s[i].r) / 2) });
}
o.resize(n + 4, -1);
sort(p.begin(), p.end());
vec<clovek> l;
vec<vec<bool>> odp(m, vec<bool>(4, false));
For(i, m) {
ll r, e;
cin >> r >> e;
l.push_back({ r, e, i });;
}
sort(l.begin(), l.end());
For(i, m) {
ll r = l[i].r; ll e = l[i].e;
while (!p.empty()) {
if (p.back().w >= r) break;
spoj(p.back().x, p.back().y);
p.pop_back();
}
int v1 = e - 1;
int v2 = e;
int v3 = e + 1;
int v4 = e + 2;
if (v2 > 3) v2 -= 4;
if (v3 > 3) v3 -= 4;
if (v4 > 3) v4 -= 4;
v1 += n; v2 += n; v3 += n; v4 += n;
odp[l[i].ind][e - 1] = true;
if (!je(v1, v2) && !je(v1, v3) && !je(v1, v4)) {
int qwe = (2 + e - 1);
if (qwe > 4) qwe -= 4;
odp[l[i].ind][qwe - 1] = true;;
}
if (!je(v2, v3) && !je(v2, v4) && !je(v1, v3) && !je(v1, v4)) {
int qwe = (3 + e - 1);
if (qwe > 4) qwe -= 4;
odp[l[i].ind][qwe - 1] = true;
}
if (!je(v4, v1) && !je(v4, v2) && !je(v4, v3)) {
int qwe = (4 + e - 1);
if (qwe > 4) qwe -= 4;
odp[l[i].ind][qwe - 1] = true;
}
}
For(i, m) {
For(j, odp[i].size()) {
if (!odp[i][j]) continue;
cout << j + 1;
}
cout << '\n';
}
return 0;
}