제출 #1352981

#제출 시각아이디문제언어결과실행 시간메모리
1352981nathlol2Park (BOI16_park)C++20
27 / 100
321 ms69468 KiB
#include <bits/stdc++.h>
#define ld long double
using namespace std;
const int N = 2e3 + 5, Q = 1e5 + 5;
int n, q, lw, tw, rw, bw;
string ans[Q];
ld h, w, x[N], y[N], r[N];
vector<tuple<ld, int, int>> a;
tuple<ld, int, int> qrs[Q];

ld dist(int i, int j){
    return sqrtl((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]));
}

struct DSU{
    int pa[N];
    void init(){
        for(int i = 0;i<N;i++) pa[i] = i;
    }
    int find(int u){
        if(u == pa[u]) return u;
        return pa[u] = find(pa[u]);
    }
    void unite(int u, int v){
        u = find(u), v = find(v);
        pa[v] = u;
    }
}dsu;

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    cin >> n >> q >> w >> h;
    lw = n + 1, tw = n + 2, rw = n + 3, bw = n + 4;
    for(int i = 1;i<=n;i++) cin >> x[i] >> y[i] >> r[i];
    for(int i = 1;i<=n;i++) for(int j = i + 1;j<=n;j++) a.push_back({dist(i, j) - r[i] - r[j], i, j});
    for(int i = 1;i<=n;i++) a.push_back({x[i] - r[i], i, lw});
    for(int i = 1;i<=n;i++) a.push_back({y[i] - r[i], i, bw});
    for(int i = 1;i<=n;i++) a.push_back({h - y[i] - r[i], i, tw});
    for(int i = 1;i<=n;i++) a.push_back({w - x[i] - r[i], i, rw});
    sort(a.begin(), a.end());
    for(int i = 1;i<=q;i++){
        auto &[rr, st, id] = qrs[i];
        cin >> rr >> st;
        id = i;
    }
    sort(qrs + 1, qrs + q + 1);
    dsu.init();
    int ptr = 0;
    for(int i = 1;i<=q;i++){
        auto [rr, st, id] = qrs[i];
        while(ptr < a.size() && get<0>(a[ptr]) < 2.0L * rr){
            dsu.unite(get<1>(a[ptr]), get<2>(a[ptr]));
            ++ptr;
        }
        if(st == 1){
            ans[id] += '1';
            if(dsu.find(lw) == dsu.find(bw)) continue;
            if(dsu.find(tw) != dsu.find(bw) && dsu.find(bw) != dsu.find(rw)) ans[id] += '2';
            if(dsu.find(tw) != dsu.find(bw) && dsu.find(lw) != dsu.find(rw) && dsu.find(tw) != dsu.find(rw)) ans[id] += '3';
            if(dsu.find(lw) != dsu.find(rw) && dsu.find(lw) != dsu.find(tw)) ans[id] += '4';
        }else if(st == 2){
            ans[id] += '2';
            if(dsu.find(bw) == dsu.find(lw)) continue;
            if(dsu.find(tw) != dsu.find(bw) && dsu.find(lw) != dsu.find(bw)) ans[id] += '1';
            if(dsu.find(tw) != dsu.find(bw) && dsu.find(lw) != dsu.find(rw) && dsu.find(lw) != dsu.find(tw)) ans[id] += '4';
            if(dsu.find(lw) != dsu.find(rw) && dsu.find(tw) != dsu.find(rw)) ans[id] += '3';
        }else if(st == 3){
            ans[id] += '3';
            if(dsu.find(tw) == dsu.find(rw)) continue;
            if(dsu.find(lw) != dsu.find(rw) && dsu.find(bw) != dsu.find(rw)) ans[id] += '2';
            if(dsu.find(lw) != dsu.find(rw) && dsu.find(tw) != dsu.find(bw) && dsu.find(bw) != dsu.find(lw)) ans[id] += '1';
            if(dsu.find(tw) != dsu.find(bw) && dsu.find(lw) != dsu.find(tw)) ans[id] += '4';
        }else{
            ans[id] += '4';
            if(dsu.find(lw) == dsu.find(tw)) continue;
            if(dsu.find(tw) != dsu.find(bw) && dsu.find(tw) != dsu.find(rw)) ans[id] += '3';
            if(dsu.find(tw) != dsu.find(bw) && dsu.find(lw) != dsu.find(rw) && dsu.find(bw) != dsu.find(rw)) ans[id] += '2';
            if(dsu.find(lw) != dsu.find(rw) && dsu.find(lw) != dsu.find(bw)) ans[id] += '1';
        }
    }
    for(int i = 1;i<=q;i++) sort(ans[i].begin(), ans[i].end()), cout << ans[i] << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...