Submission #1066739

#TimeUsernameProblemLanguageResultExecution timeMemory
1066739vjudge1Park (BOI16_park)C++17
100 / 100
2131 ms25164 KiB
#include <bits/stdc++.h>
#define ll long long
#define endl "\n"
#define fi first 
#define se second

using namespace std;

const int N = 2e3 + 3;

int n, m;
ll w, h;

vector<int> edge[N];
bool visited[N];

using pll = pair<ll, ll>;
using plll = pair<pair<ll, ll>, ll>;
vector<plll> circle(N);

int dv[] = {1, 0, -1, 0};
int dh[] = {0, 1, 0, -1};

ll qua(ll a){
    return a*a;
}

ll disQ(pair<ll, ll> loc1, pair<ll, ll> loc2){
    return qua(loc1.fi - loc2.fi) + qua(loc1.se - loc2.se);
}

bool ka(pair<pair<ll, ll>, ll> cir, ll r ){
    return h - cir.fi.se < cir.se + 2*r;
}

bool kb(pair<pair<ll, ll>, ll> cir, ll r){
    return cir.fi.se < cir.se + 2*r;
}

bool kkr(pair<pair<ll, ll>, ll> cir, ll r){
    return cir.fi.fi < cir.se + 2*r;
}

bool kkn(pair<pair<ll, ll>, ll> cir, ll r){
    return w - cir.fi.fi < cir.se + 2*r;
}


ll ver(){
    ll l = 0, r = 1e9;
    while(l <= r){
        ll md = (l + r)/2;
        for(int i = 0; i < n; i++){
            edge[i].clear();
            visited[i] = false;
        }
        for(int i = 0; i < n; i++){
            for(int j = i + 1; j < n; j++){
                if(disQ(circle[i].fi, circle[j].fi) < qua(circle[i].se + circle[j].se + 2*md)){
                    edge[i].push_back(j);
                    edge[j].push_back(i);
                }
            }
        }

        bool tutup = false;
        for(int i = 0; i < n; i++){
            if(!visited[i] && kkr(circle[i], md)){
                stack<int> st;
                st.push(i);
                while(!st.empty()){
                    int v = st.top();

                    st.pop();
                    if(!visited[v]){
                        if(kkn(circle[v], md)){
                            tutup = true;
                        }
                        visited[v] = true;
                        for(auto u: edge[v]){
                            st.push(u);
                        }
                    }
                }
            }
        }
        if(tutup){
            r = md - 1;
        }else{
            l = md + 1;
        }
    }
    return r;
}

ll a(){
    ll l = 0, r = 1e9;
    while(l <= r){
        ll md = (l + r)/2;
        for(int i = 0; i < n; i++){
            edge[i].clear();
            visited[i] = false;
        }
        for(int i = 0; i < n; i++){
            for(int j = i + 1; j < n; j++){
                if(disQ(circle[i].fi, circle[j].fi) < qua(circle[i].se + circle[j].se + 2*md)){
                    edge[i].push_back(j);
                    edge[j].push_back(i);
                }
            }
        }

        bool tutup = false;
        for(int i = 0; i < n; i++){
            if(!visited[i] && ka(circle[i], md)){
                stack<int> st;
                st.push(i);
                while(!st.empty()){
                    int v = st.top();

                    st.pop();
                    if(!visited[v]){
                        if(kkr(circle[v], md)){
                            tutup = true;
                        }
                        visited[v] = true;
                        for(auto u: edge[v]){
                            st.push(u);
                        }
                    }
                }
            }
        }
        if(tutup){
            r = md - 1;
        }else{
            l = md + 1;
        }
    }
    return r;
}

ll b(){
    ll l = 0, r = 1e9;
    while(l <= r){
        ll md = (l + r)/2;
        for(int i = 0; i < n; i++){
            edge[i].clear();
            visited[i] = false;
        }
        for(int i = 0; i < n; i++){
            for(int j = i + 1; j < n; j++){
                if(disQ(circle[i].fi, circle[j].fi) < qua(circle[i].se + circle[j].se + 2*md)){
                    edge[i].push_back(j);
                    edge[j].push_back(i);
                }
            }
        }

        bool tutup = false;
        for(int i = 0; i < n; i++){
            if(!visited[i] && ka(circle[i], md)){
                stack<int> st;
                st.push(i);
                while(!st.empty()){
                    int v = st.top();

                    st.pop();
                    if(!visited[v]){
                        if(kkn(circle[v], md)){
                            tutup = true;
                        }
                        visited[v] = true;
                        for(auto u: edge[v]){
                            st.push(u);
                        }
                    }
                }
            }
        }
        if(tutup){
            r = md - 1;
        }else{
            l = md + 1;
        }
    }
    return r;
}

ll c(){
    ll l = 0, r = 1e9;
    while(l <= r){
        ll md = (l + r)/2;
        for(int i = 0; i < n; i++){
            edge[i].clear();
            visited[i] = false;
        }
        for(int i = 0; i < n; i++){
            for(int j = i + 1; j < n; j++){
                if(disQ(circle[i].fi, circle[j].fi) < qua(circle[i].se + circle[j].se + 2*md)){
                    edge[i].push_back(j);
                    edge[j].push_back(i);
                }
            }
        }

        bool tutup = false;
        for(int i = 0; i < n; i++){
            if(!visited[i] && kb(circle[i], md)){
                stack<int> st;
                st.push(i);
                while(!st.empty()){
                    int v = st.top();

                    st.pop();
                    if(!visited[v]){
                        if(kkr(circle[v], md)){
                            tutup = true;
                        }
                        visited[v] = true;
                        for(auto u: edge[v]){
                            st.push(u);
                        }
                    }
                }
            }
        }
        if(tutup){
            r = md - 1;
        }else{
            l = md + 1;
        }
    }
    return r;
}

ll d(){
    ll l = 0, r = 1e9;
    while(l <= r){
        ll md = (l + r)/2;
        for(int i = 0; i < n; i++){
            edge[i].clear();
            visited[i] = false;
        }
        for(int i = 0; i < n; i++){
            for(int j = i + 1; j < n; j++){
                if(disQ(circle[i].fi, circle[j].fi) < qua(circle[i].se + circle[j].se + 2*md)){
                    edge[i].push_back(j);
                    edge[j].push_back(i);
                }
            }
        }

        bool tutup = false;
        for(int i = 0; i < n; i++){
            if(!visited[i] && kb(circle[i], md)){
                stack<int> st;
                st.push(i);
                while(!st.empty()){
                    int v = st.top();

                    st.pop();
                    if(!visited[v]){
                        if(kkn(circle[v], md)){
                            tutup = true;
                        }
                        visited[v] = true;
                        for(auto u: edge[v]){
                            st.push(u);
                        }
                    }
                }
            }
        }
        if(tutup){
            r = md - 1;
        }else{
            l = md + 1;
        }
    }
    return r;
}

ll hor(){
    ll l = 0, r = 1e9;
    while(l <= r){
        ll md = (l + r)/2;
        for(int i = 0; i < n; i++){
            edge[i].clear();
            visited[i] = false;
        }
        for(int i = 0; i < n; i++){
            for(int j = i + 1; j < n; j++){
                if(disQ(circle[i].fi, circle[j].fi) < qua(circle[i].se + circle[j].se + 2*md)){
                    edge[i].push_back(j);
                    edge[j].push_back(i);
                }
            }
        }

        bool tutup = false;
        for(int i = 0; i < n; i++){
            if(!visited[i] && ka(circle[i], md)){
                stack<int> st;
                st.push(i);
                while(!st.empty()){
                    int v = st.top();

                    st.pop();
                    if(!visited[v]){
                        if(kb(circle[v], md)){
                            tutup = true;
                        }
                        visited[v] = true;
                        for(auto u: edge[v]){
                            st.push(u);
                        }
                    }
                }
            }
        }
        if(tutup){
            r = md - 1;
        }else{
            l = md + 1;
        }
    }
    return r;
}


void solve(){
    cin >> n >> m; 
    cin >> w >> h;
    for(int i = 0; i < n; i++){
        cin >> circle[i].fi.fi >> circle[i].fi.se >> circle[i].se;
    }


    ll verti = ver();
    ll hori = hor();
    ll at = a();
    ll bt = b();
    ll ct = c();
    ll dt = d();
    ll r, e;
    int nilai[3][3] = {
        {4, 0, 3},
        {0, 0, 0},
        {1, 0, 2}
    };
    map<int, pair<int, int>> loc;
    loc[4] = {0, 0};
    loc[3] = {0, 2};
    loc[1] = {2, 0};
    loc[2] = {2, 2};
    for(int i = 0; i < m; i++){
        cin >> r >> e;
        vector<int> res;
        vector<vector<bool>> batas(3, vector<bool>(3, 0));
        vector<vector<bool>> visited(3, vector<bool>(3, 0));
        queue<int> q;

        if(r > verti){
            batas[1][0] = batas[1][1] = batas[1][2] = true;
        }
        if(r > hori){
            batas[0][1] = batas[1][1] = batas[2][1] = true;
        }
        if(r > at){
            batas[0][0] = true;
        }
        if(r > bt){
            batas[0][2] = true;
        }
        if(r > ct){
            batas[2][0] = true;
        }
        if(r > dt){
            batas[2][2] = true;
        }
        stack<pair<int, int>> st;
        st.push(loc[e]);
        while(!st.empty()){
            int v = st.top().fi;
            int h = st.top().se;
            st.pop();
            if(nilai[v][h] != 0 && !visited[v][h]){
                res.push_back(nilai[v][h]);
            }
            if(!batas[v][h]){
                visited[v][h] = true;
                for(int j = 0; j < 4; j++){
                    int nv = v + dv[j];
                    int nh = h + dh[j];
                    if(nv >= 0 && nv < 3 && nh >= 0 && nh < 3 && !batas[nv][nh] && !visited[nv][nh]){
                        st.push({nv, nh});
                    }
                }

            }
        }
        sort(res.begin(), res.end());
        for(int j = 0; j < res.size(); j++){
            cout << res[j];
        }
        cout << endl;
    }

}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    int t = 1;
    while(t--){
        solve();
    }
}

Compilation message (stderr)

park.cpp: In function 'void solve()':
park.cpp:404:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  404 |         for(int j = 0; j < res.size(); j++){
      |                        ~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...