답안 #658294

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
658294 2022-11-12T19:07:16 Z Richem 원 고르기 (APIO18_circle_selection) C++14
49 / 100
3000 ms 675224 KB
#include <iostream>
#include <unordered_map>
#include <algorithm>
#include <vector>
#include <time.h>
#pragma once
#include <chrono>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

struct uint64_hash {
  static inline uint64_t rotr(uint64_t x, unsigned k) {
    return (x >> k) | (x << (8U * sizeof(uint64_t) - k));
  }
 
  static inline uint64_t hash_int(uint64_t x) noexcept {
    auto h1 = x * (uint64_t)(0xA24BAED4963EE407);
    auto h2 = rotr(x, 32U) * (uint64_t)(0x9FB21C651E98DF25);
    auto h = rotr(h1 + h2, 32U);
    return h;
  }
 
  size_t operator()(uint64_t x) const {
    static const uint64_t FIXED_RANDOM = std::chrono::steady_clock::now().time_since_epoch().count();
    return hash_int(x + FIXED_RANDOM);
  }
};

template <typename K, typename V, typename Hash = uint64_hash>
using hash_map = __gnu_pbds::gp_hash_table<K, V, Hash>;
template <typename K, typename Hash = uint64_hash>
using hash_set = hash_map<K, __gnu_pbds::null_type, Hash>;
template <typename T>
using ordered_set = __gnu_pbds::tree<T, __gnu_pbds::null_type, std::less<T>, __gnu_pbds::rb_tree_tag, __gnu_pbds::tree_order_statistics_node_update>;

using namespace std;

const int MAX_CERCLE = 3e5+42, INF = 1e9;

struct Cercle{
    long long xCentre, yCentre, rayon, id;

    bool operator<(Cercle autre) {
        if(rayon == autre.rayon)
            return id < autre.id;
        return rayon > autre.rayon;
    }
};

int nbCercle;
Cercle cercle[MAX_CERCLE];

void input() {
    cin >> nbCercle;

    for(int idCercle = 0; idCercle < nbCercle; idCercle++) {
        cin >> cercle[idCercle].xCentre >> cercle[idCercle].yCentre >> cercle[idCercle].rayon;
        cercle[idCercle].xCentre += INF;
        cercle[idCercle].yCentre += INF;
        cercle[idCercle].id = idCercle;
    }
    sort(cercle, cercle + nbCercle);
}

hash_map<long long, vector<int>> grille;
bool enleve[MAX_CERCLE] = {0};

int quiEnleve[MAX_CERCLE];

long long tailleGrille = (1e12);

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    input();

    for(int grand = 0; grand < nbCercle; grand++) {
        if(enleve[grand])
            continue;

        while(tailleGrille/2 > cercle[grand].rayon) {
            tailleGrille /= 2;
            for(int cur = 0; cur < nbCercle; cur++) {
                if(enleve[cur])
                    continue;
                long long xGrille = cercle[cur].xCentre / tailleGrille, yGrille = cercle[cur].yCentre / tailleGrille;
                
                grille[(xGrille << 32) + yGrille].push_back(cur);
            }
        }

        long long xGrille = cercle[grand].xCentre / tailleGrille, yGrille = cercle[grand].yCentre / tailleGrille;

        vector<int> quiReste;
        for(int type = 0; type < 2; type++) {
            for(int deltaX = -2; deltaX <= 2; deltaX++) {
                for(int deltaY = -2; deltaY <= 2; deltaY++) {
                    long long nouvX = xGrille + deltaX, nouvY = yGrille + deltaY;

                    if(type == 1) {
                        grille.erase((nouvX << 32) + nouvY);
                        continue;
                    }

                    for(auto autre : grille[(nouvX << 32) + nouvY]) {
                        long long xDist = cercle[grand].xCentre - cercle[autre].xCentre, yDist = cercle[grand].yCentre - cercle[autre].yCentre;
                        long long rDist = cercle[grand].rayon + cercle[autre].rayon;

                        if(xDist * xDist + yDist * yDist <= rDist * rDist && !enleve[autre]) {
                            enleve[autre] = 1;
                            quiEnleve[cercle[autre].id] = cercle[grand].id;
                        }
                        if(xDist * xDist + yDist * yDist > rDist * rDist) {
                            quiReste.push_back(autre);
                        }
                    }
                }
            }
        }

        for(auto nouveau : quiReste) {
            if(enleve[nouveau])
                continue;
            long long xGrille = cercle[nouveau].xCentre / tailleGrille, yGrille = cercle[nouveau].yCentre / tailleGrille;
            
            grille[(xGrille << 32) + yGrille].push_back(nouveau);
        }
    }

    for(int cur = 0; cur < nbCercle; cur++) {
        cout << quiEnleve[cur]+1 << " ";
    }
}

Compilation message

circle_selection.cpp:6:9: warning: #pragma once in main file
    6 | #pragma once
      |         ^~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 340 KB Output is correct
2 Correct 0 ms 340 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 0 ms 340 KB Output is correct
5 Correct 0 ms 340 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 1 ms 340 KB Output is correct
8 Correct 1 ms 340 KB Output is correct
9 Correct 1 ms 340 KB Output is correct
10 Correct 0 ms 340 KB Output is correct
11 Correct 1 ms 596 KB Output is correct
12 Correct 2 ms 468 KB Output is correct
13 Correct 1 ms 596 KB Output is correct
14 Correct 1 ms 596 KB Output is correct
15 Correct 1 ms 468 KB Output is correct
16 Correct 1 ms 468 KB Output is correct
17 Correct 1 ms 468 KB Output is correct
18 Correct 1 ms 468 KB Output is correct
19 Correct 4 ms 984 KB Output is correct
20 Correct 4 ms 920 KB Output is correct
21 Correct 5 ms 1016 KB Output is correct
22 Correct 33 ms 10832 KB Output is correct
23 Correct 37 ms 10924 KB Output is correct
24 Correct 34 ms 10900 KB Output is correct
25 Correct 43 ms 10816 KB Output is correct
26 Correct 36 ms 10796 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 264 ms 39680 KB Output is correct
2 Correct 318 ms 50260 KB Output is correct
3 Correct 259 ms 42612 KB Output is correct
4 Correct 231 ms 37272 KB Output is correct
5 Correct 544 ms 93360 KB Output is correct
6 Correct 1924 ms 124356 KB Output is correct
7 Correct 608 ms 90824 KB Output is correct
8 Correct 740 ms 113232 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 985 ms 94180 KB Output is correct
3 Execution timed out 3063 ms 363892 KB Time limit exceeded
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 3110 ms 675224 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 340 KB Output is correct
2 Correct 0 ms 340 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 0 ms 340 KB Output is correct
5 Correct 0 ms 340 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 1 ms 340 KB Output is correct
8 Correct 1 ms 340 KB Output is correct
9 Correct 1 ms 340 KB Output is correct
10 Correct 0 ms 340 KB Output is correct
11 Correct 1 ms 596 KB Output is correct
12 Correct 2 ms 468 KB Output is correct
13 Correct 1 ms 596 KB Output is correct
14 Correct 1 ms 596 KB Output is correct
15 Correct 1 ms 468 KB Output is correct
16 Correct 1 ms 468 KB Output is correct
17 Correct 1 ms 468 KB Output is correct
18 Correct 1 ms 468 KB Output is correct
19 Correct 4 ms 984 KB Output is correct
20 Correct 4 ms 920 KB Output is correct
21 Correct 5 ms 1016 KB Output is correct
22 Correct 33 ms 10832 KB Output is correct
23 Correct 37 ms 10924 KB Output is correct
24 Correct 34 ms 10900 KB Output is correct
25 Correct 43 ms 10816 KB Output is correct
26 Correct 36 ms 10796 KB Output is correct
27 Correct 8 ms 1812 KB Output is correct
28 Correct 8 ms 1684 KB Output is correct
29 Correct 8 ms 1556 KB Output is correct
30 Correct 82 ms 21520 KB Output is correct
31 Correct 96 ms 21528 KB Output is correct
32 Correct 80 ms 21444 KB Output is correct
33 Correct 77 ms 12224 KB Output is correct
34 Correct 76 ms 12104 KB Output is correct
35 Correct 91 ms 16844 KB Output is correct
36 Correct 1040 ms 174660 KB Output is correct
37 Correct 996 ms 173792 KB Output is correct
38 Correct 1010 ms 174428 KB Output is correct
39 Correct 912 ms 44972 KB Output is correct
40 Correct 887 ms 44428 KB Output is correct
41 Correct 763 ms 44520 KB Output is correct
42 Correct 293 ms 50248 KB Output is correct
43 Correct 856 ms 98224 KB Output is correct
44 Correct 858 ms 98256 KB Output is correct
45 Correct 870 ms 98080 KB Output is correct
46 Correct 904 ms 98160 KB Output is correct
47 Correct 827 ms 98304 KB Output is correct
48 Correct 1029 ms 98388 KB Output is correct
49 Correct 934 ms 98236 KB Output is correct
50 Correct 884 ms 98188 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 340 KB Output is correct
2 Correct 0 ms 340 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 0 ms 340 KB Output is correct
5 Correct 0 ms 340 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 1 ms 340 KB Output is correct
8 Correct 1 ms 340 KB Output is correct
9 Correct 1 ms 340 KB Output is correct
10 Correct 0 ms 340 KB Output is correct
11 Correct 1 ms 596 KB Output is correct
12 Correct 2 ms 468 KB Output is correct
13 Correct 1 ms 596 KB Output is correct
14 Correct 1 ms 596 KB Output is correct
15 Correct 1 ms 468 KB Output is correct
16 Correct 1 ms 468 KB Output is correct
17 Correct 1 ms 468 KB Output is correct
18 Correct 1 ms 468 KB Output is correct
19 Correct 4 ms 984 KB Output is correct
20 Correct 4 ms 920 KB Output is correct
21 Correct 5 ms 1016 KB Output is correct
22 Correct 33 ms 10832 KB Output is correct
23 Correct 37 ms 10924 KB Output is correct
24 Correct 34 ms 10900 KB Output is correct
25 Correct 43 ms 10816 KB Output is correct
26 Correct 36 ms 10796 KB Output is correct
27 Correct 264 ms 39680 KB Output is correct
28 Correct 318 ms 50260 KB Output is correct
29 Correct 259 ms 42612 KB Output is correct
30 Correct 231 ms 37272 KB Output is correct
31 Correct 544 ms 93360 KB Output is correct
32 Correct 1924 ms 124356 KB Output is correct
33 Correct 608 ms 90824 KB Output is correct
34 Correct 740 ms 113232 KB Output is correct
35 Correct 1 ms 340 KB Output is correct
36 Correct 985 ms 94180 KB Output is correct
37 Execution timed out 3063 ms 363892 KB Time limit exceeded
38 Halted 0 ms 0 KB -