제출 #1188709

#제출 시각아이디문제언어결과실행 시간메모리
1188709zyadhanyPark (BOI16_park)C++20
100 / 100
1763 ms246960 KiB
#define _CRT_SECURE_NO_WARNINGS #include <bits/stdc++.h> #include <unordered_map> #include <unordered_set> #define ll int #define ld long double #define pl pair<ll, ll> #define vi vector<ll> #define vii vector<vi> #define vc vector<char> #define vcc vector<vc> #define vp vector<pl> #define mi map<ll,ll> #define mc map<char,int> #define sortx(X) sort(X.begin(),X.end()); #define all(X) X.begin(),X.end() #define allr(X) X.rbegin(),X.rend() #define ln '\n' #define YES {cout << "YES\n"; return;} #define NO {cout << "NO\n"; return;} #define MUN {cout << "-1\n"; return;} const int MODE = 1e9 + 7; using namespace std; const int MXN = 1e7 +10; int P[MXN], R[MXN]; ll get(ll n) { if (n == P[n]) return n; return P[n] = get(P[n]); } void add(ll u, ll v) { u = get(u), v = get(v); if (u == v) return; if (R[v] > R[u]) swap(u, v); R[u] += (R[v] == R[u]); P[v] = u; } void INIT() { for (int i = 0; i < MXN; i++) { P[i] = i; R[i] = 0; } } struct tree { ll x, y, r; }; ld dist(tree &a, tree & b) { ld x = a.x - b.x; ld y = a.y - b.y; return sqrtl(x*x+y*y); } void solve(int tc) { ll n,m, w, h; cin >> n >> m; cin >> w >> h; vector<tree> X(n); vii Y(m, vi(3)); for (int i = 0; i < n; i++) cin >> X[i].x >> X[i].y >> X[i].r; for (int i = 0; i < m; i++) { cin >> Y[i][0] >> Y[i][1]; Y[i][1]--; Y[i][2] = i; } set<pair<ld, pl>> edgset; for (int i = 0; i < X.size(); i++) { edgset.insert({X[i].x-X[i].r, {i+n, 0}}); // left edgset.insert({X[i].y-X[i].r, {i+n, 1}}); // bot edgset.insert({w-X[i].x-X[i].r, {i+n, 2}}); // right edgset.insert({h-X[i].y-X[i].r, {i+n, 3}}); // top for (int j = i+1; j < X.size(); j++) { ld d = dist(X[i], X[j]) - X[i].r - X[j].r; edgset.insert({d, {i+n, j+n}}); } } vii res(m); vii rech(4, vi(4, 1)); sort(Y.begin(), Y.end()); for (auto p : Y) { while (!edgset.empty() && edgset.begin()->first < 2*p[0]) { pair<ld, pl> e = *edgset.begin(); edgset.erase(edgset.begin()); ll u = get(e.second.first), v = get(e.second.second); add(u, v); } /* 0- left 1- bottom 2- right 3- top 0- bot-left 1- bot-right 2- top-right 3- top-left */ if (get(0)==get(1)) { rech[0][1] = rech[1][0] = rech[0][2] = rech[2][0] = rech[0][3] = rech[3][0] = 0; } if (get(0)==get(2)) { rech[0][2] = rech[2][0] = rech[0][3] = rech[3][0] = rech[1][2] = rech[2][1] = rech[1][3] = rech[3][1] = 0; } if (get(0) == get(3)) { rech[0][3] = rech[3][0] = rech[1][3] = rech[3][1] = rech[2][3] = rech[3][2] = 0; } if (get(1)==get(2)) { rech[1][2] = rech[2][1] = rech[1][3] = rech[3][1] = rech[1][0] = rech[0][1] = 0; } if (get(1)==get(3)) { rech[0][1] = rech[1][0] = rech[0][2] = rech[2][0] = rech[1][3] = rech[3][1] = rech[2][3] = rech[3][2] = 0; } if (get(2)==get(3)) { rech[0][2] = rech[2][0] = rech[1][2] = rech[2][1] = rech[2][3] = rech[3][2] = 0; } for (int i = 0; i < 4; i++) { if(rech[p[1]][i]) res[p[2]].push_back(i); } } for (int i = 0; i < m; i++) { for (auto a : res[i]) cout << a+1; cout << '\n'; } } int main() { ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr); int size = 1; INIT(); // freopen("skilevel.in", "r", stdin); // freopen("skilevel.out", "w", stdout); // cin >> size; for (int i = 1; i <= size; i++) solve(i); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...