답안 #98392

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
98392 2019-02-22T19:49:20 Z Kastanda Park (BOI16_park) C++11
100 / 100
972 ms 32856 KB
// * Sigh *
#include<bits/stdc++.h>
#define pb push_back
#define eps 1e-4
using namespace std;
typedef long double ld;
const int N = 2019;
int n, q, W, H, X[N], Y[N], R[N], P[N];
int D[N][N], F[5][5];
inline bool CMP(pair < int , int > &a, pair < int , int > &b)
{
    return (D[a.first][a.second] < D[b.first][b.second]);
}
int Find(int v)
{
    return (P[v] ? (P[v] = Find(P[v])) : v);
}
inline void smin(int &a, int b)
{
    a = min(a, b);
}
int main()
{
    scanf("%d%d%d%d", &n, &q, &W, &H);
    for (int i = 1; i <= n; i++)
        scanf("%d%d%d", &X[i], &Y[i], &R[i]);
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
        {
            ld d = sqrt((ld)(X[i] - X[j]) * (X[i] - X[j]) + (ld)(Y[i] - Y[j]) * (Y[i] - Y[j]));
            d = max(d - R[i] - R[j], (ld)0.000000); d /= 2.0;
            D[i][j] = (int)(d + eps);
        }
    for (int i = 1; i <= n; i++)
    {
        D[i][n + 1] = D[n + 1][i] = (int)(max((ld)Y[i] - R[i], (ld)0.0000) / 2.0 + eps);
        D[i][n + 3] = D[n + 3][i] = (int)(max((ld)H - Y[i] - R[i], (ld)0.0000) / 2.0 + eps);
        D[i][n + 2] = D[n + 2][i] = (int)(max((ld)W - X[i] - R[i], (ld)0.0000) / 2.0 + eps);
        D[i][n + 4] = D[n + 4][i] = (int)(max((ld)X[i] - R[i], (ld)0.0000) / 2.0 + eps);
    }
    D[n + 1][n + 3] = D[n + 3][n + 1] = (int)(H / 2.0 + eps);
    D[n + 2][n + 4] = D[n + 4][n + 2] = (int)(W / 2.0 + eps);
    for (int i = 0; i <= 4; i++)
        for (int j = 0; j <= 4; j++)
            F[i][j] = 1e9 + 1031232;
    vector < pair < int , int > > E;
    for (int i = 1; i <= n + 4; i++)
        for (int j = i + 1; j <= n + 4; j++)
            if (i <= n || j <= n)
                E.pb({i, j});
    E.pb({n + 1, n + 3});
    E.pb({n + 2, n + 4});
    sort(E.begin(), E.end(), CMP);
    for (auto edge : E)
    {
        int v = edge.first, u = edge.second;
        int d = D[v][u];
        v = Find(v);
        u = Find(u);
        if (v == u)
            continue;
        P[v] = u;
        if (Find(n + 1) == Find(n + 3))
        {
            smin(F[1][2], d);
            smin(F[1][3], d);
            smin(F[2][4], d);
            smin(F[3][4], d);
        }
        if (Find(n + 2) == Find(n + 4))
        {
            smin(F[1][3], d);
            smin(F[1][4], d);
            smin(F[2][3], d);
            smin(F[2][4], d);
        }
        for (int i = 1; i <= 4; i++)
        {
            int a = n + i;
            int b = (i > 1) ? (a - 1) : (n + 4);
            if (Find(a) == Find(b))
                for (int j = 1; j <= 4; j++)
                    if (i != j)
                        smin(F[i][j], d), smin(F[j][i], d);
        }
    }
    for (int i = 1; i <= 4; i++)
        for (int j = 1; j <= 4; j++)
            smin(F[i][j], F[j][i]);
    for (; q; q --)
    {
        int r, e;
        scanf("%d%d", &r, &e);
        for (int j = 1; j <= 4; j++)
            if (r <= F[e][j])
                putchar(j + '0');
        putchar('\n');
    }
    return 0;
}

Compilation message

park.cpp: In function 'int main()':
park.cpp:24:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d%d%d", &n, &q, &W, &H);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
park.cpp:26:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d%d", &X[i], &Y[i], &R[i]);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
park.cpp:93:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d", &r, &e);
         ~~~~~^~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 910 ms 32732 KB Output is correct
2 Correct 862 ms 32736 KB Output is correct
3 Correct 942 ms 32856 KB Output is correct
4 Correct 872 ms 32732 KB Output is correct
5 Correct 902 ms 32732 KB Output is correct
6 Correct 897 ms 32732 KB Output is correct
7 Correct 563 ms 32684 KB Output is correct
8 Correct 556 ms 32732 KB Output is correct
9 Correct 2 ms 384 KB Output is correct
10 Correct 2 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 35 ms 2008 KB Output is correct
2 Correct 31 ms 1908 KB Output is correct
3 Correct 33 ms 1908 KB Output is correct
4 Correct 35 ms 1916 KB Output is correct
5 Correct 34 ms 1908 KB Output is correct
6 Correct 32 ms 2036 KB Output is correct
7 Correct 28 ms 760 KB Output is correct
8 Correct 28 ms 640 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 910 ms 32732 KB Output is correct
2 Correct 862 ms 32736 KB Output is correct
3 Correct 942 ms 32856 KB Output is correct
4 Correct 872 ms 32732 KB Output is correct
5 Correct 902 ms 32732 KB Output is correct
6 Correct 897 ms 32732 KB Output is correct
7 Correct 563 ms 32684 KB Output is correct
8 Correct 556 ms 32732 KB Output is correct
9 Correct 2 ms 384 KB Output is correct
10 Correct 2 ms 384 KB Output is correct
11 Correct 35 ms 2008 KB Output is correct
12 Correct 31 ms 1908 KB Output is correct
13 Correct 33 ms 1908 KB Output is correct
14 Correct 35 ms 1916 KB Output is correct
15 Correct 34 ms 1908 KB Output is correct
16 Correct 32 ms 2036 KB Output is correct
17 Correct 28 ms 760 KB Output is correct
18 Correct 28 ms 640 KB Output is correct
19 Correct 961 ms 32776 KB Output is correct
20 Correct 972 ms 32732 KB Output is correct
21 Correct 860 ms 32736 KB Output is correct
22 Correct 890 ms 32732 KB Output is correct
23 Correct 935 ms 32728 KB Output is correct
24 Correct 568 ms 32732 KB Output is correct