Submission #1122637

#TimeUsernameProblemLanguageResultExecution timeMemory
1122637AnhPhamPark (BOI16_park)C++20
0 / 100
12 ms1344 KiB
#include <bits/stdc++.h>

using namespace std;

#define int     long long
#define sz(v)   (int)(v).size()
#define all(v)  (v).begin(), (v).end()

const   int     MOD = (int)1e9 + 7;
const   int     INF = (int)4e18 + 18;

void solve();

int32_t main() {
#define CODE ""
    if (fopen(CODE".inp", "r"))
        freopen(CODE".inp", "r", stdin), freopen(CODE".out", "w", stdout);

    cin.tie(nullptr), cout.tie(nullptr) -> sync_with_stdio(false);
    int testcases = 1;

#define multitest 0
    if (multitest) { cin >> testcases; } for (; testcases--;) { solve(); }
}

/** [Pham Hung Anh - 12I - Tran Hung Dao High School for Gifted Student] **/
/**                            The Last Dance                            **/

const int mxN = 2002;

struct POT {
    int x, y, r;
};

struct EDGE {
    int v, c;
};

int N, M, W, H;
POT pots[mxN];
vector <EDGE> adj[mxN];
string ans[mxN];
int vst[mxN];

void bfs(int st, int maxsize) {
    memset(vst, 0, sizeof vst); vst[st] = 1;
    queue <int> qu; qu.push(st);
    while (!qu.empty()) {
        int u = qu.front(); qu.pop();
        for (int i = 0; i < sz(adj[u]); i++)
            if (vst[adj[u][i].v] == 0) {
                if (adj[u][i].c < maxsize) {
                    vst[adj[u][i].v] = 1;
                    qu.push(adj[u][i].v);
                } else
                    break;
            }
    }
}


int sqr(int x) {
    return x * x;
}

void solve() {
    cin >> N >> M >> W >> H;

    for (int i = 1; i <= N; ++i)
        cin >> pots[i].x >> pots[i].y >> pots[i].r;

    for (int i = 1; i <= N; ++i) {
        EDGE e;
        for (int j = i + 1; j <= N; ++j) {
            e.c = sqrt((long double)(sqr(pots[i].x - pots[j].x) + sqr(pots[i].y - pots[j].y))) - pots[i].r - pots[j].r;
            e.v = i;
            adj[j].push_back(e);
            e.v = j;
            adj[i].push_back(e);
        }
        e.c = H - pots[i].y - pots[i].r;
        e.v = i;
        adj[N + 1].push_back(e);
        e.v = N + 1;
        adj[i].push_back(e);

        e.c = W - pots[i].x - pots[i].r;
        e.v = i;
        adj[N + 2].push_back(e);
        e.v = N + 2;
        adj[i].push_back(e);

        e.c = pots[i].y - pots[i].r;
        e.v = i;
        adj[N + 3].push_back(e);
        e.v = N + 3;
        adj[i].push_back(e);

        e.c = pots[i].x - pots[i].r;
        e.v = i;
        adj[N + 4].push_back(e);
        e.v = N + 4;
        adj[i].push_back(e);
    }

    for (int i = 1; i <= N + 4; ++i)
        sort(all(adj[i]), [&](const EDGE &lhs, const EDGE &rhs) -> bool {
            return lhs.c < rhs.c;
        });

    for (int r, e, i = 1; i <= M; ++i) {
        cin >> r >> e;

        r = r * 2;
        int go1 = 1;
        int go2 = 1;
        int go3 = 1;
        int go4 = 1;

        bfs(N + 1, r);
        if (e == 1) {
            if (vst[N + 3]) go3 = go2 = 0;
            if (vst[N + 2]) go3 = 0;
            if (vst[N + 4]) go4 = 0;
        } else if (e == 2) {
            if (vst[N + 3]) go4 = go1 = 0;
            if (vst[N + 2]) go3 = 0;
            if (vst[N + 4]) go4 = 0;
        } else if (e == 3) {
            if (vst[N + 3]) go4 = go1 = 0;
            if (vst[N + 2]) go1 = go2 = go4 = 0;
            if (vst[N + 4]) go4 = 0;
        } else if (e == 4) {
            if (vst[N + 3]) go2 = go3 = 0;
            if (vst[N + 2]) go3 = 0;
            if (vst[N + 4]) go1 = go2 = go3 = 0;
        }

        if (go1 + go2 + go3 + go4 > 1) {
            bfs(N + 2, r);
            if (e == 1) {
                if (vst[N + 3]) go2 = 0;
                if (vst[N + 4]) go3 = go4 = 0;
            } else if (e == 2) {
                if (vst[N + 3]) go1 = go3 = go4 = 0;
                if (vst[N + 4]) go3 = go4 = 0;
            } else if (e == 3) {
                if (vst[N + 3]) go2 = 0;
                if (vst[N + 4]) go1 = go2 = 0;
            } else if (e == 4) {
                if (vst[N + 3]) go2 = 0;
                if (vst[N + 4]) go1 = go2 = 0;
            }
        }

        if (go1 + go2 + go3 + go4 > 1) {
           bfs(N + 3, r);
           if (e == 1)
               if (vst[N + 4]) go2 = go3 = go4 = 0;
           else if (e == 2)
               if (vst[N + 4]) go1 = 0;
           else if (e == 3)
               if (vst[N + 4]) go1 = 0;
           else if (e == 4)
               if (vst[N + 4]) go1 = 0;
        }

        string ret = "";
        if (go1) ret += "1";
        if (go2) ret += "2";
        if (go3) ret += "3";
        if (go4) ret += "4";

        ans[i] = ret;
    }

    for (int i = 1; i <= M; ++i)
        cout << ans[i] << '\n';
}

Compilation message (stderr)

park.cpp: In function 'int32_t main()':
park.cpp:17:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   17 |         freopen(CODE".inp", "r", stdin), freopen(CODE".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
park.cpp:17:49: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   17 |         freopen(CODE".inp", "r", stdin), freopen(CODE".out", "w", stdout);
      |                                          ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...