Submission #1352637

#TimeUsernameProblemLanguageResultExecution timeMemory
1352637po_rag526Park (BOI16_park)C++20
100 / 100
384 ms71544 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;
    long double r;
    int st;
    bool operator<(const query &o) const
    {
        return r < o.r;
    }
} q[100005];
string ans[100005];
struct tree
{
    long double x, y, r;
} t[2050];
struct pot
{
    int u, v;
    long double r;
    bool operator<(const pot &o) const
    {
        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)
        {
            long double dist = hypot((t[i].x - t[j].x),(t[i].y - t[j].y));
            dist -= t[i].r + t[j].r;
            if (dist <= 0.0)
                unite(i, j);
            else
            {
                a.push_back({i, j, dist});
            }
        }
    }
    for (int i = 4; i <= n + 3; ++i)
    {
        long double dist = t[i].x;
        dist -= t[i].r;
        if (dist <= 0.0)
            unite(0, i);
        else
            a.push_back({0, i, dist});
    }
    for (int i = 4; i <= n + 3; ++i)
    {
        long double dist = t[i].y;
        dist -= t[i].r;
        if (dist <= 0.0)
            unite(1, i);
        else
            a.push_back({1, i, dist});
    }
    for (int i = 4; i <= n + 3; ++i)
    {
        long double dist = w - t[i].x;
        dist -= t[i].r;
        if (dist <= 0.0)
            unite(2, i);
        else
            a.push_back({2, i, dist});
    }
    for (int i = 4; i <= n + 3; ++i)
    {
        long double dist = h - t[i].y;
        dist -= t[i].r;
        if (dist <= 0.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 <= 0.0)
        {
            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 > 0 ? j2 : 4)] = 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 > 0 ? j2 : 4)] = 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] << (i < m ? "\n" : "");
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...