제출 #1352460

#제출 시각아이디문제언어결과실행 시간메모리
1352460vjudge1Park (BOI16_park)C++20
0 / 100
2594 ms904 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 MOD = 1e9+7;
int xi[N],yi[N],ri[N],p[N],mark[N][5],adj[5][5];

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++) {
        cin >> xi[i] >> yi[i] >> ri[i];
    }
    while (m--) {
        memset(mark,0,sizeof(mark));
        memset(adj,0,sizeof(adj));
        int r,e; cin >> r >> e;
        for (int i = 1; i <= n; i++) p[i] = 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 dr = ri[i]+ri[j]+2*r;
                if (dx*dx+dy*dy <= dr*dr) {
                    int rii = fr(i), rjj = fr(j);
                    p[rii] = rjj;
                }
            }
        }
        for (int i = 1; i <= n; i++) {
            int rii = fr(i);
            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;
        }
        for (int i = 1; i <= n; i++) {
            if (i != fr(i)) continue;
            if (mark[i][1] && mark[i][4]) upd(4);
            if (mark[i][4] && mark[i][3]) upd(3);
            if (mark[i][3] && mark[i][2]) upd(2);
            if (mark[i][1] && mark[i][2]) upd(1);
            if (mark[i][4] && mark[i][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[i][1] && mark[i][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;
            cout << i;
        }
        cout << "\n";
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...