Submission #1352509

#TimeUsernameProblemLanguageResultExecution timeMemory
1352509po_rag526Park (BOI16_park)C++20
27 / 100
448 ms49904 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define ll long long
#define pii pair<int,int>

inline void dbg() { cout << '\n'; }
template <class Head, class... Tail>
inline void dbg(const Head& head, const Tail&... tail) {
    cout << head << ' ';
    dbg(tail...);
}

const int N = 2020;
const int M = 1e5+10;
const int MOD = 1e9+7;
int xi[N],yi[N],ri[N],p[N],ans[M][5],mark[N][5],adj[5][5];

struct hee {
    int r,e,idx;
    bool operator < (const hee&o) const {
        return r < o.r;
    }
};

vector<hee> ed;
hee qu[M];

int fr(int i) {
    if (i == p[i]) return i;
    return p[i] = fr(p[i]);
}

void upd(int i) {
    for (int j = 1; j <= 4; j++) {
        if (j == i) continue;
        adj[i][j] = adj[j][i] = 1;
    }
}

int32_t main() {
    ios::sync_with_stdio(false); cin.tie(nullptr);
    int n,m; cin >> n >> m;
    int w,h; cin >> w >> h;
    for (int i = 1; i <= n; i++) {
        p[i] = i;
        cin >> xi[i] >> yi[i] >> ri[i];
    }
    for (int i = 1; i <= n; i++) {
        for (int j = i+1; j <= n; j++) {
            int dx = xi[i]-xi[j], dy = yi[i]-yi[j];
            int l = 0, r = 1e9;
            while (l < r) {
                int mid = (l+r)/2;
                int dr = ri[i]+ri[j]+2*mid;
                if (dx*dx+dy*dy < dr*dr) r = mid;
                else l = mid+1;
            }
            ed.push_back({l,i,j});
        }
    }
    for (int i = 1; i <= m; i++) {
        cin >> qu[i].r >> qu[i].e;
        qu[i].idx = i;
    }
    sort(ed.begin(),ed.end());
    sort(qu+1,qu+1+m);
    // for (auto x : ed) cout << x.r << " " << x.e << " " << x.idx << "\n";
    int now = 0;
    for (int i = 1; i <= m; i++) {
        int r = qu[i].r, e = qu[i].e, idx = qu[i].idx;
        while (now < ed.size() && ed[now].r <= r) {
            int i = ed[now].e, j = ed[now].idx;
            int rii = fr(i), rjj = fr(j);
            for (int i = 1; i <= 4; i++) {
                if (mark[rjj][i]) mark[rii][i] = 1;
            }
            p[rjj] = rii;
            now++;
            if (xi[i]+ri[i]+r*2 > w) mark[rii][3] = 1;
            if (xi[i]-ri[i]-r*2 < 0) mark[rii][1] = 1;
            if (yi[i]+ri[i]+r*2 > h) mark[rii][4] = 1;
            if (yi[i]-ri[i]-r*2 < 0) mark[rii][2] = 1;
            if (xi[j]+ri[j]+r*2 > w) mark[rii][3] = 1;
            if (xi[j]-ri[j]-r*2 < 0) mark[rii][1] = 1;
            if (yi[j]+ri[j]+r*2 > h) mark[rii][4] = 1;
            if (yi[j]-ri[j]-r*2 < 0) mark[rii][2] = 1;
            if (mark[rii][1] && mark[rii][4]) upd(4);
            if (mark[rii][4] && mark[rii][3]) upd(3);
            if (mark[rii][3] && mark[rii][2]) upd(2);
            if (mark[rii][1] && mark[rii][2]) upd(1);
            if (mark[rii][4] && mark[rii][2]) {
                adj[4][2] = adj[2][4] = 1;
                adj[4][3] = adj[3][4] = 1;
                adj[1][2] = adj[2][1] = 1;
                adj[1][3] = adj[3][1] = 1;
            }
            if (mark[rii][1] && mark[rii][3]) {
                adj[4][1] = adj[1][4] = 1;
                adj[4][2] = adj[2][4] = 1;
                adj[3][1] = adj[1][3] = 1;
                adj[3][2] = adj[2][3] = 1;
            }
        }
        for (int i = 1; i <= 4; i++) {
            if (adj[e][i]) continue;
            ans[idx][i] = 1;
        }
    }
    for (int i = 1; i <= m; i++) {
        for (int j = 1; j <= 4; j++) {
            if (!ans[i][j]) continue;
            cout << j;
        }
        cout << "\n";
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...