답안 #446952

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
446952 2021-07-24T05:01:03 Z blue 분수 공원 (IOI21_parks) C++17
35 / 100
3500 ms 117680 KB
#include "parks.h"
#include <vector>
#include <set>
#include <algorithm>
#include <iostream>
using namespace std;

const int maxN = 200'000;
const int MX = 1'000'000;



vector<int> fountain_edge[maxN];
vector<int> fountain_visit(maxN, 0);
int visit_count = 0;

void fountain_dfs(int u)
{
    fountain_visit[u] = 1;
    visit_count++;
    for(int v: fountain_edge[u])
    {
        if(fountain_visit[v]) continue;
        fountain_dfs(v);
    }
}






struct point
{
    int i;
    int x;
    int y;
};

bool operator < (point A, point B)
{
    if(A.x == B.x) return A.y < B.y;
    return A.x < B.x;
};


int N;
vector<int> X, Y;
set<point> fountains;

int point_index(int x, int y)
{
    set<point>::iterator it = fountains.find(point{-1, x, y});
    if(it == fountains.end()) return -1;
    else return it->i;
}





struct path
{
    int i;
    int a;
    int b;

    path(int A, int B)
    {
        a = min(A, B);
        b = max(A, B);
    }

    path(int I, int A, int B)
    {
        i = I;
        a = min(A, B);
        b = max(A, B);
    }
};

bool operator < (path P, path Q)
{
    if(P.a == Q.a) return P.b < Q.b;
    return P.a < Q.a;
}

vector<path> temp_paths;
set<path> paths;





struct bench
{
    int i;
    int x;
    int y;
};

bool operator < (bench C, bench D)
{
    if(C.x == D.x) return C.y < D.y;
    return C.x < D.x;
}


set<bench> benches;

int bench_index(int x, int y)
{
    set<bench>::iterator it = benches.find(bench{-1, x, y});
    if(it == benches.end()) return -1;
    else return it->i;
}


vector<path>* bench_edge = new vector<path>[MX];











vector<int> bench_visit(MX, 0);

vector<int> U, V, A, B;










vector<int> parent(maxN);
vector<int> siz(maxN, 1);


int getRoot(int u)
{
    int v;
    for(v = u; parent[v] != v; v = parent[v]);
    parent[u] = v;
    return v;
}

void join(int u, int v)
{
    u = getRoot(u);
    v = getRoot(v);

    if(siz[u] < siz[v]) swap(u, v);

    parent[v] = u;
}

bool connected(int u, int v)
{
    return getRoot(u) == getRoot(v);
}








int construct_roads(vector<int> x, vector<int> y)
{
    // cerr << "check\n";
    X = x;
    Y = y;

    N = X.size();

    for(int i = 0; i < N; i++)
        fountains.insert(point{i, x[i], y[i]});







    // cerr << "check 2\n";


    for(int i = 0; i < N; i++)
    {
        int I;

        I = point_index(x[i] - 2, y[i]);
        if(I != -1)
        {
            // cerr << i << ' ' << I << '\n';

            fountain_edge[i].push_back(I);
            fountain_edge[I].push_back(i);

            temp_paths.push_back(path(i, I));

            // cerr << temp_paths.size() << '\n';
        }

        I = point_index(x[i], y[i] - 2);
        if(I != -1)
        {
            // cerr << i << ' ' << I << '\n';

            fountain_edge[i].push_back(I);
            fountain_edge[I].push_back(i);

            temp_paths.push_back(path(i, I));

            // cerr << temp_paths.size() << '\n';
        }
    }

    // cerr << temp_paths.size() << '\n';

    // cerr << "check 3\n";






    fountain_dfs(0);
    if(visit_count != N)
    {
        return 0;
    }





    int path_id = -1;
    for(path p: temp_paths)
    {
        path_id++;
            // cerr << "P -> " << path_id << ' ' << p.a <<  ' ' << p.b << '\n';
        paths.insert(path(path_id, p.a, p.b));
    }

    // cerr << "check 4\n";







    int bench_id = -1;
    for(path p: paths)
    {
        // cerr << "p = " << p.i << ' ' << p.a << ' ' << p.b << '\n';
        int x1 = X[p.a];
        int y1 = Y[p.a];

        int x2 = X[p.b];
        int y2 = Y[p.b];


        bench new_bench;

        if(x1 == x2)
        {
            if( ((x1+1) + (y1+y2)/2) % 4 == 0 )
                new_bench = bench{-1, x1+1, (y1+y2)/2};
            else
                new_bench = bench{-1, x1-1, (y1+y2)/2};
        }
        else
        {
            if( ((x1+x2)/2 + (y1+1)) % 4 == 2 )
                new_bench = bench{-1, (x1+x2)/2, y1+1};
            else
                new_bench = bench{-1, (x1+x2)/2, y1-1};
        }

        int curr_bench_index;

        // cerr << "before I\n";

        int I = bench_index(new_bench.x, new_bench.y);

        if(I == -1)
        {
            bench_id++;
            curr_bench_index = bench_id;

            new_bench.i = curr_bench_index;

            benches.insert(new_bench);
        }
        else
        {
            curr_bench_index = I;
        }

        bench_edge[curr_bench_index].push_back(p);
    }

    // cerr << "check 5\n";









    for(int i = 0; i < N; i++)
        parent[i] = i;


    for(int i = 0; i <= bench_id; i++)
    {
        sort(bench_edge[i].begin(), bench_edge[i].end(), [] (path P1, path P2)
        {
            if(X[P1.a] == X[P1.b]) return Y[P1.a] < Y[P1.b];
            else return X[P1.a] < X[P1.b];
        });
    }

    // cerr << "check 6\n";



    for(bench q: benches)
    {
        for(path z: bench_edge[q.i])
        {
            if(connected(z.a, z.b)) continue;

            U.push_back(z.a);
            V.push_back(z.b);
            A.push_back(q.x);
            B.push_back(q.y);

            join(z.a, z.b);

            break;
        }
    }

    // cerr << "check 7\n";

    build(U, V, A, B);
    return 1;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 17 ms 34636 KB Output is correct
2 Correct 17 ms 34724 KB Output is correct
3 Correct 17 ms 34704 KB Output is correct
4 Correct 17 ms 34636 KB Output is correct
5 Correct 17 ms 34760 KB Output is correct
6 Correct 17 ms 34752 KB Output is correct
7 Correct 17 ms 34636 KB Output is correct
8 Correct 18 ms 34664 KB Output is correct
9 Correct 301 ms 72424 KB Output is correct
10 Correct 33 ms 38596 KB Output is correct
11 Correct 129 ms 55032 KB Output is correct
12 Correct 44 ms 40400 KB Output is correct
13 Correct 54 ms 41340 KB Output is correct
14 Correct 17 ms 34892 KB Output is correct
15 Correct 18 ms 34904 KB Output is correct
16 Correct 321 ms 71132 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 17 ms 34636 KB Output is correct
2 Correct 17 ms 34724 KB Output is correct
3 Correct 17 ms 34704 KB Output is correct
4 Correct 17 ms 34636 KB Output is correct
5 Correct 17 ms 34760 KB Output is correct
6 Correct 17 ms 34752 KB Output is correct
7 Correct 17 ms 34636 KB Output is correct
8 Correct 18 ms 34664 KB Output is correct
9 Correct 301 ms 72424 KB Output is correct
10 Correct 33 ms 38596 KB Output is correct
11 Correct 129 ms 55032 KB Output is correct
12 Correct 44 ms 40400 KB Output is correct
13 Correct 54 ms 41340 KB Output is correct
14 Correct 17 ms 34892 KB Output is correct
15 Correct 18 ms 34904 KB Output is correct
16 Correct 321 ms 71132 KB Output is correct
17 Correct 17 ms 34764 KB Output is correct
18 Correct 17 ms 34636 KB Output is correct
19 Correct 17 ms 34676 KB Output is correct
20 Correct 17 ms 34764 KB Output is correct
21 Correct 19 ms 34756 KB Output is correct
22 Correct 17 ms 34688 KB Output is correct
23 Correct 1032 ms 116904 KB Output is correct
24 Correct 17 ms 34652 KB Output is correct
25 Correct 19 ms 35208 KB Output is correct
26 Correct 19 ms 35148 KB Output is correct
27 Correct 21 ms 35276 KB Output is correct
28 Correct 333 ms 67896 KB Output is correct
29 Correct 513 ms 83008 KB Output is correct
30 Correct 784 ms 100740 KB Output is correct
31 Correct 1004 ms 116400 KB Output is correct
32 Correct 17 ms 34704 KB Output is correct
33 Correct 21 ms 34764 KB Output is correct
34 Correct 18 ms 34764 KB Output is correct
35 Correct 17 ms 34712 KB Output is correct
36 Correct 18 ms 34748 KB Output is correct
37 Correct 17 ms 34652 KB Output is correct
38 Correct 18 ms 34768 KB Output is correct
39 Correct 18 ms 34676 KB Output is correct
40 Correct 17 ms 34764 KB Output is correct
41 Correct 17 ms 34636 KB Output is correct
42 Correct 18 ms 34712 KB Output is correct
43 Correct 19 ms 35020 KB Output is correct
44 Correct 19 ms 35076 KB Output is correct
45 Correct 331 ms 71624 KB Output is correct
46 Correct 563 ms 89660 KB Output is correct
47 Correct 533 ms 89036 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 17 ms 34636 KB Output is correct
2 Correct 17 ms 34724 KB Output is correct
3 Correct 17 ms 34704 KB Output is correct
4 Correct 17 ms 34636 KB Output is correct
5 Correct 17 ms 34760 KB Output is correct
6 Correct 17 ms 34752 KB Output is correct
7 Correct 17 ms 34636 KB Output is correct
8 Correct 18 ms 34664 KB Output is correct
9 Correct 301 ms 72424 KB Output is correct
10 Correct 33 ms 38596 KB Output is correct
11 Correct 129 ms 55032 KB Output is correct
12 Correct 44 ms 40400 KB Output is correct
13 Correct 54 ms 41340 KB Output is correct
14 Correct 17 ms 34892 KB Output is correct
15 Correct 18 ms 34904 KB Output is correct
16 Correct 321 ms 71132 KB Output is correct
17 Correct 17 ms 34764 KB Output is correct
18 Correct 17 ms 34636 KB Output is correct
19 Correct 17 ms 34676 KB Output is correct
20 Correct 17 ms 34764 KB Output is correct
21 Correct 19 ms 34756 KB Output is correct
22 Correct 17 ms 34688 KB Output is correct
23 Correct 1032 ms 116904 KB Output is correct
24 Correct 17 ms 34652 KB Output is correct
25 Correct 19 ms 35208 KB Output is correct
26 Correct 19 ms 35148 KB Output is correct
27 Correct 21 ms 35276 KB Output is correct
28 Correct 333 ms 67896 KB Output is correct
29 Correct 513 ms 83008 KB Output is correct
30 Correct 784 ms 100740 KB Output is correct
31 Correct 1004 ms 116400 KB Output is correct
32 Correct 17 ms 34704 KB Output is correct
33 Correct 21 ms 34764 KB Output is correct
34 Correct 18 ms 34764 KB Output is correct
35 Correct 17 ms 34712 KB Output is correct
36 Correct 18 ms 34748 KB Output is correct
37 Correct 17 ms 34652 KB Output is correct
38 Correct 18 ms 34768 KB Output is correct
39 Correct 18 ms 34676 KB Output is correct
40 Correct 17 ms 34764 KB Output is correct
41 Correct 17 ms 34636 KB Output is correct
42 Correct 18 ms 34712 KB Output is correct
43 Correct 19 ms 35020 KB Output is correct
44 Correct 19 ms 35076 KB Output is correct
45 Correct 331 ms 71624 KB Output is correct
46 Correct 563 ms 89660 KB Output is correct
47 Correct 533 ms 89036 KB Output is correct
48 Correct 17 ms 34680 KB Output is correct
49 Correct 17 ms 34764 KB Output is correct
50 Correct 17 ms 34668 KB Output is correct
51 Correct 17 ms 34636 KB Output is correct
52 Correct 18 ms 34708 KB Output is correct
53 Correct 18 ms 34672 KB Output is correct
54 Correct 17 ms 34688 KB Output is correct
55 Incorrect 1097 ms 117680 KB Given structure is not connected: There is no path between vertices 0 and 110
56 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 17 ms 34636 KB Output is correct
2 Correct 17 ms 34724 KB Output is correct
3 Correct 17 ms 34704 KB Output is correct
4 Correct 17 ms 34636 KB Output is correct
5 Correct 17 ms 34760 KB Output is correct
6 Correct 17 ms 34752 KB Output is correct
7 Correct 17 ms 34636 KB Output is correct
8 Correct 18 ms 34664 KB Output is correct
9 Correct 301 ms 72424 KB Output is correct
10 Correct 33 ms 38596 KB Output is correct
11 Correct 129 ms 55032 KB Output is correct
12 Correct 44 ms 40400 KB Output is correct
13 Correct 54 ms 41340 KB Output is correct
14 Correct 17 ms 34892 KB Output is correct
15 Correct 18 ms 34904 KB Output is correct
16 Correct 321 ms 71132 KB Output is correct
17 Correct 17 ms 34660 KB Output is correct
18 Correct 17 ms 34676 KB Output is correct
19 Correct 17 ms 34636 KB Output is correct
20 Correct 776 ms 111720 KB Output is correct
21 Correct 816 ms 110352 KB Output is correct
22 Correct 804 ms 109700 KB Output is correct
23 Correct 646 ms 98408 KB Output is correct
24 Correct 280 ms 51900 KB Output is correct
25 Correct 426 ms 60556 KB Output is correct
26 Correct 386 ms 60560 KB Output is correct
27 Correct 767 ms 104816 KB Output is correct
28 Correct 808 ms 104708 KB Output is correct
29 Correct 1002 ms 104784 KB Output is correct
30 Correct 866 ms 104868 KB Output is correct
31 Correct 18 ms 34636 KB Output is correct
32 Correct 50 ms 39968 KB Output is correct
33 Correct 102 ms 43344 KB Output is correct
34 Correct 818 ms 110880 KB Output is correct
35 Correct 26 ms 36172 KB Output is correct
36 Correct 74 ms 41200 KB Output is correct
37 Correct 171 ms 47604 KB Output is correct
38 Correct 256 ms 63600 KB Output is correct
39 Correct 380 ms 73484 KB Output is correct
40 Correct 529 ms 85220 KB Output is correct
41 Correct 712 ms 95612 KB Output is correct
42 Correct 850 ms 105624 KB Output is correct
43 Correct 17 ms 34764 KB Output is correct
44 Correct 17 ms 34636 KB Output is correct
45 Correct 16 ms 34680 KB Output is correct
46 Correct 17 ms 34692 KB Output is correct
47 Correct 17 ms 34636 KB Output is correct
48 Correct 17 ms 34656 KB Output is correct
49 Correct 17 ms 34716 KB Output is correct
50 Correct 17 ms 34636 KB Output is correct
51 Correct 18 ms 34748 KB Output is correct
52 Correct 17 ms 34664 KB Output is correct
53 Correct 17 ms 34764 KB Output is correct
54 Correct 18 ms 34956 KB Output is correct
55 Correct 19 ms 35172 KB Output is correct
56 Correct 314 ms 71504 KB Output is correct
57 Correct 542 ms 89308 KB Output is correct
58 Correct 526 ms 89140 KB Output is correct
59 Correct 18 ms 34764 KB Output is correct
60 Correct 19 ms 34692 KB Output is correct
61 Correct 17 ms 34676 KB Output is correct
62 Correct 775 ms 109172 KB Output is correct
63 Correct 821 ms 109468 KB Output is correct
64 Correct 798 ms 109572 KB Output is correct
65 Correct 20 ms 35276 KB Output is correct
66 Correct 23 ms 35804 KB Output is correct
67 Correct 324 ms 70596 KB Output is correct
68 Correct 570 ms 90332 KB Output is correct
69 Correct 810 ms 106932 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 17 ms 34636 KB Output is correct
2 Correct 17 ms 34724 KB Output is correct
3 Correct 17 ms 34704 KB Output is correct
4 Correct 17 ms 34636 KB Output is correct
5 Correct 17 ms 34760 KB Output is correct
6 Correct 17 ms 34752 KB Output is correct
7 Correct 17 ms 34636 KB Output is correct
8 Correct 18 ms 34664 KB Output is correct
9 Correct 301 ms 72424 KB Output is correct
10 Correct 33 ms 38596 KB Output is correct
11 Correct 129 ms 55032 KB Output is correct
12 Correct 44 ms 40400 KB Output is correct
13 Correct 54 ms 41340 KB Output is correct
14 Correct 17 ms 34892 KB Output is correct
15 Correct 18 ms 34904 KB Output is correct
16 Correct 321 ms 71132 KB Output is correct
17 Correct 788 ms 111452 KB Output is correct
18 Correct 780 ms 111012 KB Output is correct
19 Correct 818 ms 111572 KB Output is correct
20 Correct 1065 ms 116288 KB Output is correct
21 Correct 767 ms 101268 KB Output is correct
22 Correct 18 ms 34764 KB Output is correct
23 Correct 105 ms 46520 KB Output is correct
24 Correct 36 ms 37340 KB Output is correct
25 Correct 113 ms 44316 KB Output is correct
26 Correct 246 ms 51852 KB Output is correct
27 Correct 467 ms 74260 KB Output is correct
28 Correct 622 ms 84192 KB Output is correct
29 Correct 670 ms 95048 KB Output is correct
30 Correct 924 ms 104628 KB Output is correct
31 Correct 1052 ms 114272 KB Output is correct
32 Execution timed out 3549 ms 107156 KB Time limit exceeded
33 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 17 ms 34636 KB Output is correct
2 Correct 17 ms 34724 KB Output is correct
3 Correct 17 ms 34704 KB Output is correct
4 Correct 17 ms 34636 KB Output is correct
5 Correct 17 ms 34760 KB Output is correct
6 Correct 17 ms 34752 KB Output is correct
7 Correct 17 ms 34636 KB Output is correct
8 Correct 18 ms 34664 KB Output is correct
9 Correct 301 ms 72424 KB Output is correct
10 Correct 33 ms 38596 KB Output is correct
11 Correct 129 ms 55032 KB Output is correct
12 Correct 44 ms 40400 KB Output is correct
13 Correct 54 ms 41340 KB Output is correct
14 Correct 17 ms 34892 KB Output is correct
15 Correct 18 ms 34904 KB Output is correct
16 Correct 321 ms 71132 KB Output is correct
17 Correct 17 ms 34764 KB Output is correct
18 Correct 17 ms 34636 KB Output is correct
19 Correct 17 ms 34676 KB Output is correct
20 Correct 17 ms 34764 KB Output is correct
21 Correct 19 ms 34756 KB Output is correct
22 Correct 17 ms 34688 KB Output is correct
23 Correct 1032 ms 116904 KB Output is correct
24 Correct 17 ms 34652 KB Output is correct
25 Correct 19 ms 35208 KB Output is correct
26 Correct 19 ms 35148 KB Output is correct
27 Correct 21 ms 35276 KB Output is correct
28 Correct 333 ms 67896 KB Output is correct
29 Correct 513 ms 83008 KB Output is correct
30 Correct 784 ms 100740 KB Output is correct
31 Correct 1004 ms 116400 KB Output is correct
32 Correct 17 ms 34704 KB Output is correct
33 Correct 21 ms 34764 KB Output is correct
34 Correct 18 ms 34764 KB Output is correct
35 Correct 17 ms 34712 KB Output is correct
36 Correct 18 ms 34748 KB Output is correct
37 Correct 17 ms 34652 KB Output is correct
38 Correct 18 ms 34768 KB Output is correct
39 Correct 18 ms 34676 KB Output is correct
40 Correct 17 ms 34764 KB Output is correct
41 Correct 17 ms 34636 KB Output is correct
42 Correct 18 ms 34712 KB Output is correct
43 Correct 19 ms 35020 KB Output is correct
44 Correct 19 ms 35076 KB Output is correct
45 Correct 331 ms 71624 KB Output is correct
46 Correct 563 ms 89660 KB Output is correct
47 Correct 533 ms 89036 KB Output is correct
48 Correct 17 ms 34680 KB Output is correct
49 Correct 17 ms 34764 KB Output is correct
50 Correct 17 ms 34668 KB Output is correct
51 Correct 17 ms 34636 KB Output is correct
52 Correct 18 ms 34708 KB Output is correct
53 Correct 18 ms 34672 KB Output is correct
54 Correct 17 ms 34688 KB Output is correct
55 Incorrect 1097 ms 117680 KB Given structure is not connected: There is no path between vertices 0 and 110
56 Halted 0 ms 0 KB -