제출 #1351125

#제출 시각아이디문제언어결과실행 시간메모리
1351125SzymonKrzywdaPark (BOI16_park)C++20
100 / 100
175 ms36604 KiB
#include <iostream>
#include <unordered_map>
#include <unordered_set>
#include <vector>
#include <cmath>
#include <algorithm>

using namespace std;
using vi = vector<int>;
using pii = pair<int, int>;
using ll = long long;
using pll = pair<ll, ll>;

#define ff first
#define ss second


const int MAXN = 2e3 + 7;
ll tab[MAXN + 100][3];
string ans[(int)1e5 + 100];

int rep[MAXN + 100]; //kolejne sciazny to MAXN, MAXN + 1, MAXN + 2, MAXN + 3
int find(int v) {
    if (rep[v] == v) return rep[v];
    return rep[v] = find(rep[v]);
}

void onion(int a, int b) {
    a = find(a);
    b = find(b);
    rep[a] = b;
}

ll odl(pll a, pll b) {
    return sqrtl((a.ff - b.ff) * (a.ff - b.ff) + (a.ss - b.ss) * (a.ss - b.ss));
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0); 

    int n, q;
    cin >> n >> q;
    ll w, h;
    cin >> w >> h;
    ll x, y, r;

    for (int i = 0; i < n; i++) {
        cin >> tab[i][0] >> tab[i][1] >> tab[i][2];
    }

    vector<pair<pii, ll>> kraw;

    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            kraw.push_back({{i, j}, odl({tab[i][0], tab[i][1]}, {tab[j][0], tab[j][1]}) - tab[i][2] - tab[j][2]});
        }
        kraw.push_back({{MAXN, i}, tab[i][0] - tab[i][2]});
        kraw.push_back({{MAXN + 1, i}, tab[i][1] - tab[i][2]});
        kraw.push_back({{MAXN + 2, i}, w - tab[i][0] - tab[i][2]});
        kraw.push_back({{MAXN + 3, i}, h - tab[i][1] - tab[i][2]});
    }

    for (int i = 0; i < MAXN + 10; i++) rep[i] = i;

    sort(kraw.begin(), kraw.end(), [&](pair<pii, ll> & a, pair<pii, ll> & b){return a.ss < b.ss;});
    vector<pair<pii, int>> zap(q);
    for (int i = 0; i < q; i++) {
        cin >> zap[i].ff.ff >> zap[i].ff.ss;
        zap[i].ss = i;
    }

    sort(zap.begin(), zap.end());


    int wsk = 0;
    for (int z = 0; z < q; z++) {
        ll e = zap[z].ff.ss;
        r = zap[z].ff.ff;

        while (wsk < kraw.size() && kraw[wsk].ss < 2 * r) {
            onion(kraw[wsk].ff.ff, kraw[wsk].ff.ss);
            wsk++;
        }

        int rep2[4] = {find(MAXN), find(MAXN + 1), find(MAXN + 2), find(MAXN + 3)};
        e--;
        vi git(4, 1);

        if (rep2[e] == rep2[(e + 1) % 4]) {
            for (int i = 0; i < 4; i++) {
                if (e != i) git[i] = 0;
            }
        }
        else {
            for (int i = 0; i < 4; i++) {
                if (rep2[i] == rep2[(i + 1) % 4]) git[i] = 0;
            }
            if (rep2[e] == rep2[(e + 2) % 4]) {
                git[(e + 2) % 4] = 0;
                git[(e + 3) % 4] = 0;
            }
            if (rep2[(e + 1) % 4] == rep2[(e + 3) % 4]) {
                git[(e + 1) % 4] = 0;
                git[(e + 2) % 4] = 0;
            }
        }

        for (int i = 0; i < 4; i++) if (git[i]) ans[zap[z].ss] += to_string(i + 1);


        //cout << find(MAXN) << ' ' << find(MAXN + 1) << ' ' << find(MAXN + 2) << ' ' << find(MAXN + 3) << '\n';
    }

    for (int i = 0; i < q; i++) cout << ans[i] << '\n';

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...