답안 #790866

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
790866 2023-07-23T09:05:56 Z xetrk 원 고르기 (APIO18_circle_selection) C++14
57 / 100
3000 ms 159000 KB
#pragma warning(disable:4996)

#include<bits/stdc++.h>
#include<unordered_set>
#include<unordered_map>
using namespace std;


typedef long long ll;
typedef long double ld;

int n;

vector<vector<ll>> circle;

vector<pair<ll, int>> sortRadius;
//set<pair<ll,int>> sortX, sortY;

//int skipX[300100], skipY[300100];
//int xIdx[300100], yIdx[300100];

set<vector<ll>> circleSet;


int ans[301000];

inline ll GetDist(ll x1, ll y1, ll x2, ll y2)
{
    // 아 좌표값 마이너스도 들어오네
    ll xx = max(x1, x2) - min(x1, x2);
    ll yy = max(y1, y2) - min(y1, y2);
    return (xx * xx) + (yy * yy);
}



bool comp(const pair<ll, int>& a, const pair<ll, int>& b)
{
    if (a.first == b.first)
        return a.second < b.second;
    return a.first < b.first;
}

bool compSort(const pair<ll, int>& a, const pair<ll, int>& b)
{
    if (a.first == b.first)
        return a.second < b.second;

    return a.first > b.first;
}

inline ll Pos2ll(ll x , ll y)
{
    return y * 3000000001L + x;
}

map<ll, multiset<vector<ll>>> SetGrid(ll gridSize)
{
    map<ll, multiset<vector<ll>>> myGrid;
    ll x, y, r, i, posll;
    for (auto c = circleSet.begin(); c != circleSet.end(); c++)
    {
        x = (*c)[0], y = (*c)[1], r = (*c)[2], i = (*c)[3];
        posll = Pos2ll(x / gridSize, y / gridSize);
        auto iter = myGrid.insert({ posll ,{{x,y,r,i}} });
        if (iter.second == false)
        {
            //auto iter = myGrid.find(posll);
            iter.first->second.insert({ x,y,r,i });
        }
    }

    return myGrid;

}

int main()
{

    ll x, y, r, r2;
    int i;
    scanf("%d", &n);

    for (int i = 0; i < n; i++)
    {
        scanf("%lld %lld %lld", &x, &y, &r);
        //x = 1, y = 1, r = 3;
        //좌표는 양수로만 그래야 그리드계산 편함
        //1000000000
        x += 1000000000L;
        y += 1000000000L;
        //1000000000
        circle.push_back({ x,y,r });
        circleSet.insert({ x,y,r,i });
        sortRadius.push_back({ r,i });
    }

    sort(sortRadius.begin(), sortRadius.end(), compSort);
    //sort(sortX.begin(), sortX.end());
    //sort(sortY.begin(), sortY.end());


    int cur, curcmp;
    //int xMin, xMax, yMin, yMax;
    ll rr;

    fill(ans, ans + n + 2, -1);

    ll gridSize = sortRadius[0].first * 2LL;
    map<ll, multiset<vector<ll>>> gridAll = SetGrid(gridSize);

    ll gridX, gridY;
    ll nx, ny, nr, gridll, curll;
    int ni;

    multiset<vector<ll>> curGrids;
    

    for (int curDelete = 0; curDelete < n; curDelete++)
    {
        cur = sortRadius[curDelete].second;
        if (ans[cur] != -1)
            continue;

        if (gridSize / 2 >= sortRadius[curDelete].first * 2LL && gridSize/2 >= 1 )
        {
            gridSize /= 2;
            gridAll = SetGrid(gridSize);
        }

        ans[cur] = cur;

        x = circle[cur][0], y = circle[cur][1], r = circle[cur][2];

        gridX = x / gridSize, gridY = y / gridSize;
        circleSet.erase({ x,y,r,cur });
        gridll = Pos2ll(gridX, gridY);

        (*gridAll.find(gridll)).second.erase({ x,y,r,cur });

        for (int curGridX = gridX - 1; curGridX <= gridX + 1; curGridX++)
        {
            for (int curGridY = gridY - 1; curGridY <= gridY + 1; curGridY++)
            {
                curll = Pos2ll(curGridX, curGridY);
                auto ggg = gridAll.find(curll);
                if (ggg == gridAll.end())
                    continue;
                curGrids = (*ggg).second;
                vector<multiset<vector<ll>>::iterator> eraseItems;
                for (auto curCircle = curGrids.begin(); curCircle != curGrids.end(); curCircle++)
                {
                    nx = (*curCircle)[0], ny = (*curCircle)[1], nr = (*curCircle)[2], ni = (*curCircle)[3];
                    if (ans[ni] != -1)
                        continue;
                    if (GetDist(x, y, nx, ny) <= (r + nr) * (r + nr))
                    {
                        ans[ni] = cur;
                        eraseItems.push_back(curCircle);

                        circleSet.erase({ nx,ny,nr,ni });//log n 최대 n번
                    }
                }

                for (auto eraseIt : eraseItems)
                    curGrids.erase(eraseIt);//log n 최대 n*32 번

            }
        }

    }

    for (int i = 0; i < n; i++)
        printf("%d ", ans[i] + 1);

    return 0;
}

Compilation message

circle_selection.cpp:1: warning: ignoring '#pragma warning ' [-Wunknown-pragmas]
    1 | #pragma warning(disable:4996)
      | 
circle_selection.cpp: In function 'int main()':
circle_selection.cpp:80:17: warning: unused variable 'r2' [-Wunused-variable]
   80 |     ll x, y, r, r2;
      |                 ^~
circle_selection.cpp:81:9: warning: unused variable 'i' [-Wunused-variable]
   81 |     int i;
      |         ^
circle_selection.cpp:103:14: warning: unused variable 'curcmp' [-Wunused-variable]
  103 |     int cur, curcmp;
      |              ^~~~~~
circle_selection.cpp:105:8: warning: unused variable 'rr' [-Wunused-variable]
  105 |     ll rr;
      |        ^~
circle_selection.cpp:82:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   82 |     scanf("%d", &n);
      |     ~~~~~^~~~~~~~~~
circle_selection.cpp:86:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   86 |         scanf("%lld %lld %lld", &x, &y, &r);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 308 KB Output is correct
2 Correct 1 ms 292 KB Output is correct
3 Correct 0 ms 308 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 1 ms 312 KB Output is correct
8 Correct 1 ms 340 KB Output is correct
9 Correct 1 ms 340 KB Output is correct
10 Correct 1 ms 340 KB Output is correct
11 Correct 1 ms 340 KB Output is correct
12 Correct 1 ms 340 KB Output is correct
13 Correct 1 ms 340 KB Output is correct
14 Correct 1 ms 340 KB Output is correct
15 Correct 1 ms 308 KB Output is correct
16 Correct 2 ms 596 KB Output is correct
17 Correct 2 ms 596 KB Output is correct
18 Correct 2 ms 724 KB Output is correct
19 Correct 7 ms 2516 KB Output is correct
20 Correct 8 ms 2336 KB Output is correct
21 Correct 10 ms 2412 KB Output is correct
22 Correct 13 ms 2508 KB Output is correct
23 Correct 14 ms 2524 KB Output is correct
24 Correct 13 ms 2424 KB Output is correct
25 Correct 12 ms 2460 KB Output is correct
26 Correct 13 ms 2524 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 875 ms 110264 KB Output is correct
2 Correct 1018 ms 111116 KB Output is correct
3 Correct 993 ms 114996 KB Output is correct
4 Correct 750 ms 124236 KB Output is correct
5 Correct 809 ms 91448 KB Output is correct
6 Correct 1198 ms 99560 KB Output is correct
7 Correct 913 ms 92116 KB Output is correct
8 Correct 965 ms 93292 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 641 ms 40812 KB Output is correct
3 Correct 2600 ms 119640 KB Output is correct
4 Correct 2702 ms 119344 KB Output is correct
5 Correct 2537 ms 146676 KB Output is correct
6 Correct 933 ms 71912 KB Output is correct
7 Correct 387 ms 33624 KB Output is correct
8 Correct 36 ms 6904 KB Output is correct
9 Correct 2748 ms 159000 KB Output is correct
10 Correct 2363 ms 153368 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1942 ms 119380 KB Output is correct
2 Correct 1710 ms 119384 KB Output is correct
3 Correct 1200 ms 92864 KB Output is correct
4 Correct 1909 ms 119384 KB Output is correct
5 Correct 1764 ms 119380 KB Output is correct
6 Correct 1237 ms 90848 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 308 KB Output is correct
2 Correct 1 ms 292 KB Output is correct
3 Correct 0 ms 308 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 1 ms 312 KB Output is correct
8 Correct 1 ms 340 KB Output is correct
9 Correct 1 ms 340 KB Output is correct
10 Correct 1 ms 340 KB Output is correct
11 Correct 1 ms 340 KB Output is correct
12 Correct 1 ms 340 KB Output is correct
13 Correct 1 ms 340 KB Output is correct
14 Correct 1 ms 340 KB Output is correct
15 Correct 1 ms 308 KB Output is correct
16 Correct 2 ms 596 KB Output is correct
17 Correct 2 ms 596 KB Output is correct
18 Correct 2 ms 724 KB Output is correct
19 Correct 7 ms 2516 KB Output is correct
20 Correct 8 ms 2336 KB Output is correct
21 Correct 10 ms 2412 KB Output is correct
22 Correct 13 ms 2508 KB Output is correct
23 Correct 14 ms 2524 KB Output is correct
24 Correct 13 ms 2424 KB Output is correct
25 Correct 12 ms 2460 KB Output is correct
26 Correct 13 ms 2524 KB Output is correct
27 Correct 19 ms 4084 KB Output is correct
28 Correct 17 ms 4312 KB Output is correct
29 Correct 14 ms 4064 KB Output is correct
30 Correct 28 ms 4612 KB Output is correct
31 Correct 26 ms 4520 KB Output is correct
32 Correct 25 ms 4592 KB Output is correct
33 Correct 196 ms 44132 KB Output is correct
34 Correct 217 ms 37420 KB Output is correct
35 Correct 254 ms 35376 KB Output is correct
36 Correct 691 ms 40796 KB Output is correct
37 Correct 614 ms 40856 KB Output is correct
38 Correct 677 ms 40800 KB Output is correct
39 Execution timed out 3005 ms 49796 KB Time limit exceeded
40 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 308 KB Output is correct
2 Correct 1 ms 292 KB Output is correct
3 Correct 0 ms 308 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 1 ms 312 KB Output is correct
8 Correct 1 ms 340 KB Output is correct
9 Correct 1 ms 340 KB Output is correct
10 Correct 1 ms 340 KB Output is correct
11 Correct 1 ms 340 KB Output is correct
12 Correct 1 ms 340 KB Output is correct
13 Correct 1 ms 340 KB Output is correct
14 Correct 1 ms 340 KB Output is correct
15 Correct 1 ms 308 KB Output is correct
16 Correct 2 ms 596 KB Output is correct
17 Correct 2 ms 596 KB Output is correct
18 Correct 2 ms 724 KB Output is correct
19 Correct 7 ms 2516 KB Output is correct
20 Correct 8 ms 2336 KB Output is correct
21 Correct 10 ms 2412 KB Output is correct
22 Correct 13 ms 2508 KB Output is correct
23 Correct 14 ms 2524 KB Output is correct
24 Correct 13 ms 2424 KB Output is correct
25 Correct 12 ms 2460 KB Output is correct
26 Correct 13 ms 2524 KB Output is correct
27 Correct 875 ms 110264 KB Output is correct
28 Correct 1018 ms 111116 KB Output is correct
29 Correct 993 ms 114996 KB Output is correct
30 Correct 750 ms 124236 KB Output is correct
31 Correct 809 ms 91448 KB Output is correct
32 Correct 1198 ms 99560 KB Output is correct
33 Correct 913 ms 92116 KB Output is correct
34 Correct 965 ms 93292 KB Output is correct
35 Correct 1 ms 212 KB Output is correct
36 Correct 641 ms 40812 KB Output is correct
37 Correct 2600 ms 119640 KB Output is correct
38 Correct 2702 ms 119344 KB Output is correct
39 Correct 2537 ms 146676 KB Output is correct
40 Correct 933 ms 71912 KB Output is correct
41 Correct 387 ms 33624 KB Output is correct
42 Correct 36 ms 6904 KB Output is correct
43 Correct 2748 ms 159000 KB Output is correct
44 Correct 2363 ms 153368 KB Output is correct
45 Correct 1942 ms 119380 KB Output is correct
46 Correct 1710 ms 119384 KB Output is correct
47 Correct 1200 ms 92864 KB Output is correct
48 Correct 1909 ms 119384 KB Output is correct
49 Correct 1764 ms 119380 KB Output is correct
50 Correct 1237 ms 90848 KB Output is correct
51 Correct 19 ms 4084 KB Output is correct
52 Correct 17 ms 4312 KB Output is correct
53 Correct 14 ms 4064 KB Output is correct
54 Correct 28 ms 4612 KB Output is correct
55 Correct 26 ms 4520 KB Output is correct
56 Correct 25 ms 4592 KB Output is correct
57 Correct 196 ms 44132 KB Output is correct
58 Correct 217 ms 37420 KB Output is correct
59 Correct 254 ms 35376 KB Output is correct
60 Correct 691 ms 40796 KB Output is correct
61 Correct 614 ms 40856 KB Output is correct
62 Correct 677 ms 40800 KB Output is correct
63 Execution timed out 3005 ms 49796 KB Time limit exceeded
64 Halted 0 ms 0 KB -