Submission #1275184

#TimeUsernameProblemLanguageResultExecution timeMemory
1275184garam1732Park (BOI16_park)C++20
100 / 100
819 ms23228 KiB
#include <bits/stdc++.h>
using namespace std;

#define ff first
#define ss second
#define bl ' '
#define endl '\n'
#define all(v) (v).begin(), (v).end()
#define comp(v) (v).erase(unique(all(v)), (v).end())
#define lbd(v,x) lower_bound(all(v), (x))-(v).begin()
#define ubd(v,x) upper_bound(all(v), (x))-(v).begin()

typedef long long ll;
typedef pair<int, int> pi;
typedef pair<pi, int> pii;
typedef pair<int, pi> ipi;
typedef pair<pi, pi> pipi;
typedef pair<ll, ll> pll;

const int MAXN = 100100*2;
const ll MOD = 998244353;
const ll INF = 2e9;

int par[2020];
int root(int x){return par[x]==x?x:par[x]=root(par[x]);}
void merge(int a, int b) {
    a=root(a), b=root(b);
    if(a^b) par[a]=b;
}

struct Circle {
    int x,y,r;
} arr[2020];

struct Visitor {
    int r,c,x;
} qry[100100];

vector<pi> v;
int U, D, L, R;
int n, m;
int w, h;

ll dist(pi a, pi b) {
    return (ll)(a.ff-b.ff)*(a.ff-b.ff) + (ll)(a.ss-b.ss)*(a.ss-b.ss);
}

double f(pi a) {
    int p=a.ff, q=a.ss;
    if(q < n) {
        return sqrt((double)dist(pi(arr[p].x,arr[p].y), pi(arr[q].x,arr[q].y))) - arr[p].r - arr[q].r;
    }

    if(q == U) return (h-arr[p].y-arr[p].r);
    if(q == D) return (arr[p].y-arr[p].r);
    if(q == R) return (w-arr[p].x-arr[p].r);
    return (arr[p].x-arr[p].r);
}

bool cmp(pi a, pi b) {
    return f(a) < f(b);
}

vector<int> res[100100];

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

    cin>>n>>m; cin>>w>>h;
    for(int i=0;i<n;i++) {
        cin>>arr[i].x>>arr[i].y>>arr[i].r;
    }

    U=n, D=n+1, L=n+2, R=n+3;
    for(int i=0;i<n;i++) for(int j=i+1;j<n;j++) v.push_back({i,j});
    for(int i=0;i<n;i++) for(int j=n;j<n+4;j++) v.push_back({i,j});
    sort(all(v), cmp);

    for(int i=0;i<n+4;i++) par[i]=i;

    for(int i=0;i<m;i++) {
        cin>>qry[i].r>>qry[i].c; qry[i].x=i;
    } sort(qry, qry+m, [&](Visitor &a, Visitor &b){return a.r<b.r;});

    for(int i=0, idx=0;i<m;i++) {
        while(idx<v.size() && f(v[idx]) < 2*qry[i].r) {
            merge(v[idx].ff, v[idx].ss);
            idx++;
        }

        bool chk[5] = {1,1,1,1,1};
        if((root(D) == root(L))) {
            if(qry[i].c == 1) {for(int x:{1,2,3,4}) if(x^1) chk[x]=0;}
            else chk[1]=0;
        } if((root(D) == root(R))) {
            if(qry[i].c == 2) {for(int x:{1,2,3,4}) if(x^2) chk[x]=0;}
            else chk[2]=0;
        } if((root(U) == root(R))) {
            if(qry[i].c == 3) {for(int x:{1,2,3,4}) if(x^3) chk[x]=0;}
            else chk[3]=0;
        } if((root(U) == root(L))) {
            if(qry[i].c == 4) {for(int x:{1,2,3,4}) if(x^4) chk[x]=0;}
            else chk[4]=0;
        }

        if(root(U) == root(D)) {
            if(qry[i].c == 1 || qry[i].c == 4) chk[2] = chk[3] = 0;
            else chk[1] = chk[4] = 0;
        } if(root(L) == root(R)) {
            if(qry[i].c == 1 || qry[i].c == 2) chk[3] = chk[4] = 0;
            else chk[1] = chk[2] = 0;
        }
        
        for(int x:{1,2,3,4}) if(chk[x]) res[qry[i].x].push_back(x);
    } for(int i=0;i<m;i++) {
        for(int x:res[i]) cout<<x;cout<<endl;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...