提出 #29417326


ソースコード 拡げる

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
void chmin(int& a, int b){ if(a > b) a = b; }
void chmax(int& a, int b){ if(a < b) a = b; }


using T = array<int, 3>;
struct kDTree{
    using Iter = vector<T>::iterator;
    kDTree *l = nullptr, *r = nullptr;
    // 円形クエリのために x / y 座標の最小値と最大値を持つ
    int xmin = INT_MAX, xmax = INT_MIN, ymin = INT_MAX, ymax = INT_MIN;
    // 1 要素しか持っていない時の index
    int idx = -1;
    kDTree(Iter begin, Iter end){
        // vecqtor<T> で渡してもいいですが、コピーコストがかかるので in-place に
        for(auto p = begin; p != end; p++){
            auto [x, y, i] = *p;
            chmin(xmin, x);
            chmax(xmax, x);
            chmin(ymin, y);
            chmax(ymax, y);
        }
        const int size = int(end - begin);
        if(size == 1) idx = (*begin)[2];
        if(size <= 1) return;
        // 葉木なので x / y 座標で半分に分けて再帰
        auto cen = begin + size / 2;
        if(unsigned(xmax - xmin) > unsigned(ymax - ymin)){
            // 長い方で分ける (正方形に近い方が効率がいい)
            nth_element(begin, cen, end, [](T& a, T& b){ return a[0] < b[0]; });
        }
        else{
            nth_element(begin, cen, end, [](T& a, T& b){ return a[1] < b[1]; });
        }
        l = new kDTree(begin, cen);
        r = new kDTree(cen, end);
    }
    
    // sqrt(dx^2 + dy^2) ≤ K
    static bool inside(int dx, int dy, int K){
        return ll(dx) * dx + ll(dy) * dy <= ll(K) * K;
    }
    
    // (x, y) から距離 K 以下の点を f に報告する
    template<class F> void get(int x, int y, int K, F f) const {
        // [xmin, xmax] * [ymin, ymax] と ((x, y) から半径 K 以内) に共通部分がない
        if(!inside(clamp(x, xmin, xmax) - x, clamp(y, ymin, ymax) - y, K)) return;
        // 葉なら idx を報告
        if(idx != -1){
            f(idx);
            return;
        }
        l->get(x, y, K, f);
        r->get(x, y, K, f);
    }
};
int main(){
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    int N, K;
    cin >> N >> K;
    vector<T> A(N);
    for(auto& [x, y, i] : A) cin >> x >> y;
    for(int i = 0; i < N; i++) A[i][2] = i;
    vector<pair<int, int>> ans;
    kDTree tree(A.begin(), A.end());
    for(auto [x, y, i] : A) tree.get(x, y, K, [&, i = i](int j){ if(i < j) ans.emplace_back(i + 1, j + 1); });
    sort(ans.begin(), ans.end());
    cout << ans.size() << '\n';
    for(auto [x, y] : ans) cout << x << ' ' << y << '\n';
}

提出情報

提出日時
問題 Ex - Enumerate Pairs
ユーザ tatyam
言語 C++ (GCC 9.2.1)
得点 600
コード長 2614 Byte
結果 AC
実行時間 288 ms
メモリ 30088 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 600 / 600
結果
AC × 3
AC × 85
セット名 テストケース
Sample sample_01.txt, sample_02.txt, sample_03.txt
All hack.txt, sample_01.txt, sample_02.txt, sample_03.txt, type01_10.txt, type01_11.txt, type01_12.txt, type01_13.txt, type01_14.txt, type01_15.txt, type01_16.txt, type01_17.txt, type01_18.txt, type02_01.txt, type02_03.txt, type02_06.txt, type02_08.txt, type02_09.txt, type02_11.txt, type02_14.txt, type02_16.txt, type03_01.txt, type03_02.txt, type03_03.txt, type03_04.txt, type04_01.txt, type04_02.txt, type04_03.txt, type04_04.txt, type05_13.txt, type05_14.txt, type05_15.txt, type05_16.txt, type05_17.txt, type05_18.txt, type05_19.txt, type05_20.txt, type05_21.txt, type05_22.txt, type05_23.txt, type05_24.txt, type06_01.txt, type06_02.txt, type06_03.txt, type06_04.txt, type06_05.txt, type06_06.txt, type06_07.txt, type06_08.txt, type06_09.txt, type06_10.txt, type07_01.txt, type07_02.txt, type07_03.txt, type07_04.txt, type08_02.txt, type08_03.txt, type08_06.txt, type08_07.txt, type08_10.txt, type08_11.txt, type08_14.txt, type08_15.txt, type08_18.txt, type08_19.txt, type08_22.txt, type08_23.txt, type09_06.txt, type09_07.txt, type10_01.txt, type10_02.txt, type10_03.txt, type10_04.txt, type10_05.txt, type10_06.txt, type10_07.txt, type10_08.txt, type10_09.txt, type10_10.txt, type10_11.txt, type10_12.txt, type11_01.txt, type11_02.txt, type11_03.txt, type11_04.txt
ケース名 結果 実行時間 メモリ
hack.txt AC 196 ms 26248 KiB
sample_01.txt AC 5 ms 3620 KiB
sample_02.txt AC 2 ms 3508 KiB
sample_03.txt AC 3 ms 3596 KiB
type01_10.txt AC 103 ms 7468 KiB
type01_11.txt AC 182 ms 17900 KiB
type01_12.txt AC 173 ms 19536 KiB
type01_13.txt AC 267 ms 29940 KiB
type01_14.txt AC 273 ms 29944 KiB
type01_15.txt AC 225 ms 27120 KiB
type01_16.txt AC 270 ms 29936 KiB
type01_17.txt AC 271 ms 30056 KiB
type01_18.txt AC 223 ms 26992 KiB
type02_01.txt AC 28 ms 4300 KiB
type02_03.txt AC 94 ms 8432 KiB
type02_06.txt AC 86 ms 7436 KiB
type02_08.txt AC 128 ms 12616 KiB
type02_09.txt AC 17 ms 3780 KiB
type02_11.txt AC 102 ms 8476 KiB
type02_14.txt AC 32 ms 4176 KiB
type02_16.txt AC 126 ms 12616 KiB
type03_01.txt AC 134 ms 15776 KiB
type03_02.txt AC 184 ms 18912 KiB
type03_03.txt AC 182 ms 18908 KiB
type03_04.txt AC 187 ms 18904 KiB
type04_01.txt AC 141 ms 24152 KiB
type04_02.txt AC 140 ms 24176 KiB
type04_03.txt AC 142 ms 24328 KiB
type04_04.txt AC 142 ms 24328 KiB
type05_13.txt AC 18 ms 3924 KiB
type05_14.txt AC 14 ms 3704 KiB
type05_15.txt AC 7 ms 3672 KiB
type05_16.txt AC 19 ms 3800 KiB
type05_17.txt AC 5 ms 3612 KiB
type05_18.txt AC 81 ms 7444 KiB
type05_19.txt AC 43 ms 5252 KiB
type05_20.txt AC 80 ms 7452 KiB
type05_21.txt AC 7 ms 3700 KiB
type05_22.txt AC 15 ms 3848 KiB
type05_23.txt AC 18 ms 3784 KiB
type05_24.txt AC 52 ms 5336 KiB
type06_01.txt AC 7 ms 3648 KiB
type06_02.txt AC 2 ms 3508 KiB
type06_03.txt AC 2 ms 3568 KiB
type06_04.txt AC 2 ms 3632 KiB
type06_05.txt AC 2 ms 3576 KiB
type06_06.txt AC 1 ms 3604 KiB
type06_07.txt AC 3 ms 3464 KiB
type06_08.txt AC 2 ms 3620 KiB
type06_09.txt AC 4 ms 3620 KiB
type06_10.txt AC 3 ms 3620 KiB
type07_01.txt AC 2 ms 3524 KiB
type07_02.txt AC 2 ms 3508 KiB
type07_03.txt AC 2 ms 3596 KiB
type07_04.txt AC 2 ms 3508 KiB
type08_02.txt AC 212 ms 29944 KiB
type08_03.txt AC 214 ms 30068 KiB
type08_06.txt AC 222 ms 29940 KiB
type08_07.txt AC 222 ms 29944 KiB
type08_10.txt AC 222 ms 29936 KiB
type08_11.txt AC 224 ms 29936 KiB
type08_14.txt AC 227 ms 29936 KiB
type08_15.txt AC 230 ms 29944 KiB
type08_18.txt AC 221 ms 29936 KiB
type08_19.txt AC 229 ms 29996 KiB
type08_22.txt AC 226 ms 30068 KiB
type08_23.txt AC 231 ms 29940 KiB
type09_06.txt AC 8 ms 3516 KiB
type09_07.txt AC 2 ms 3512 KiB
type10_01.txt AC 274 ms 29932 KiB
type10_02.txt AC 285 ms 30088 KiB
type10_03.txt AC 284 ms 29936 KiB
type10_04.txt AC 281 ms 29936 KiB
type10_05.txt AC 281 ms 29940 KiB
type10_06.txt AC 285 ms 29940 KiB
type10_07.txt AC 285 ms 29940 KiB
type10_08.txt AC 286 ms 29928 KiB
type10_09.txt AC 282 ms 29936 KiB
type10_10.txt AC 288 ms 29936 KiB
type10_11.txt AC 286 ms 30052 KiB
type10_12.txt AC 286 ms 29936 KiB
type11_01.txt AC 136 ms 26344 KiB
type11_02.txt AC 135 ms 26156 KiB
type11_03.txt AC 134 ms 26352 KiB
type11_04.txt AC 141 ms 26332 KiB