Submission #1352483

#TimeUsernameProblemLanguageResultExecution timeMemory
1352483po_rag526Park (BOI16_park)C++20
0 / 100
216 ms53028 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,m,w,h;
int p[2500];
int find(int u) {
    if(p[u] == u) return u;
    return p[u] = find(p[u]);
}
void unite(int u,int v) {
    u = find(u),v = find(v);
    if(u == v) return;
    p[u] = v;
}
struct query{
    int id;double r; int st;
    bool operator<(const query&o) {
        return r<o.r;
    }
} q[100005];
string ans[100005];
struct tree{
    double x,y,r;
} t[2050];
struct pot{
    int u,v; double r;
    bool operator<(const pot&o) {
        return r<o.r;
    }
};
vector<pot> a;

int32_t main() {
    ios_base::sync_with_stdio(0),cin.tie(0);
    cin>>n>>m>>w>>h;
    for(int i = 4 ; i<=n+3 ; ++i) {
        cin>>t[i].x>>t[i].y>>t[i].r;
    }
    for(int i = 0 ; i<=n+3 ; ++i) p[i] = i;
    for(int i = 4 ; i<=n+3 ; ++i) {
        for(int j = i+1 ; j<=n+3 ; ++j) {
            double dist = sqrt((t[i].x-t[j].x)*(t[i].x-t[j].x)+(t[i].y-t[j].y)*(t[i].y-t[j].y));
            dist -= t[i].r+t[j].r;
            if(dist <= 0) unite(i,j);
            else {
                a.push_back({i,j,dist});
            }
        }
    }
    for(int i = 4 ; i<=n+3 ; ++i) {
        double dist = t[i].x;
        dist-=t[i].r;
        if(dist <= 0) unite(0,i);
        else a.push_back({0,i,dist});
    }
    for(int i =4  ; i<=n+3 ; ++i) {
        double dist = t[i].y;
        dist-=t[i].r;
        if(dist <= 0) unite(1,i);
        else a.push_back({1,i,dist});
    }
    for(int i = 4 ; i<=n+3 ; ++i) {
        double dist = w-t[i].x;
        dist-=t[i].r;
        if(dist <= 0) unite(2,i);
        else a.push_back({2,i,dist});
    }
    for(int i = 4 ; i<=n+3 ; ++i) {
        double dist = h-t[i].y;
        dist-=t[i].r;
        if(dist <= 0) unite(3,i);
        else a.push_back({3,i,dist});
    }
    sort(a.begin(),a.end());
    for(int i = 1 ; i<=m ; ++i) {
        cin>>q[i].r>>q[i].st,q[i].id = i;
        q[i].r*=2.0;
    }
    sort(q+1,q+1+m);
    int now = 1;
    for(int i = 0 ; i<a.size() ; ++i) {
        while(now <= m && q[now].r < a[i].r) {
            vector<bool> mark(5,0);
            if(find(0) == find(2)) {
                mark[5-q[now].st] = 1;
                int now2 = 5-q[now].st;
                if(now2 == 2 || now2 == 1) {
                    mark[3-now2] = 1;
                }
                else mark[7-now2] = 1;
            }
            if(find(1) == find(3)) {
                int now2;
                if(q[now].st == 1 || q[now].st == 2) now2 = 3-q[now].st;
                else now2 = 7-q[now].st;
                mark[now2] = 1;
                mark[5-now2] = 1;
            }
            for(int i = 1 ; i<=4 ; ++i) {
                int j1 = i%4,j2 = (i+1)%4;
                if(find(j1) != find(j2)) continue;
                if(j2 == q[now].st%4) {
                    for(int j = 1 ; j<=4 ; ++j) {
                        if(j != q[now].st) {
                            mark[j] = 1;
                        }
                    }
                }
                else {
                    mark[(j2<4?j2:0)] = 1;
                }
            }
            for(int i = 1 ; i<=4 ; ++i) {
                if(!mark[i]) ans[q[now].id]+=(char)(i+'0');
            }
            now++;
        }
        unite(a[i].u,a[i].v);
    }
    while(now <= m) {
        vector<bool> mark(5,0);
            if(find(0) == find(2)) {
                mark[5-q[now].st] = 1;
                int now2 = 5-q[now].st;
                if(now2 == 2 || now2 == 1) {
                    mark[3-now2] = 1;
                }
                else mark[7-now2] = 1;
            }
            if(find(1) == find(3)) {
                int now2;
                if(q[now].st == 1 || q[now].st == 2) now2 = 3-q[now].st;
                else now2 = 7-q[now].st;
                mark[now2] = 1;
                mark[5-now2] = 1;
            }
            for(int i = 1 ; i<=4 ; ++i) {
                int j1 = i%4,j2 = (i+1)%4;
                if(find(j1) != find(j2)) continue;
                if(j2 == q[now].st%4) {
                    for(int j = 1 ; j<=4 ; ++j) {
                        if(j != q[now].st) {
                            mark[j] = 1;
                        }
                    }
                }
                else {
                    mark[(j2<4?j2:0)] = 1;
                }
            }
            for(int i = 1 ; i<=4 ; ++i) {
                if(!mark[i]) ans[q[now].id]+=(char)(i+'0');
            }
            now++;
    }
    for(int i = 1 ; i<=m ; ++i) cout << ans[i] << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...