結果

問題 No.202 1円玉投げ
ユーザー kimiyukikimiyuki
提出日時 2017-03-14 22:26:46
言語 C++14
(gcc 10.2.0 + boost 1.73.0)
結果
AC  
実行時間 2,883 ms / 5,000 ms
コード長 2,053 Byte
コンパイル時間 2,494 ms
使用メモリ 7,028 KB
最終ジャッジ日時 2021-04-13 20:09:33
合計ジャッジ時間 44,168 ms
ジャッジサーバーID
(参考情報)
judge7 / judge10
このコードへのチャレンジ(β)

テストケース

テストケース表示
入力 結果 実行時間
使用メモリ
testcase_00 AC 2,830 ms
4,044 KB
testcase_01 AC 1 ms
3,016 KB
testcase_02 AC 2 ms
2,884 KB
testcase_03 AC 1 ms
2,864 KB
testcase_04 AC 13 ms
2,928 KB
testcase_05 AC 1,970 ms
3,852 KB
testcase_06 AC 2,486 ms
4,172 KB
testcase_07 AC 2,519 ms
4,068 KB
testcase_08 AC 779 ms
3,484 KB
testcase_09 AC 141 ms
3,280 KB
testcase_10 AC 522 ms
3,468 KB
testcase_11 AC 560 ms
3,536 KB
testcase_12 AC 173 ms
3,304 KB
testcase_13 AC 17 ms
2,960 KB
testcase_14 AC 729 ms
3,512 KB
testcase_15 AC 2,883 ms
4,148 KB
testcase_16 AC 2,867 ms
4,172 KB
testcase_17 AC 2,869 ms
4,172 KB
testcase_18 AC 642 ms
3,544 KB
testcase_19 AC 1,603 ms
3,748 KB
testcase_20 AC 635 ms
3,560 KB
testcase_21 AC 2 ms
3,028 KB
testcase_22 AC 2 ms
2,892 KB
testcase_23 AC 2 ms
3,000 KB
testcase_24 AC 2 ms
2,928 KB
testcase_25 AC 2 ms
3,028 KB
testcase_26 AC 2 ms
3,036 KB
testcase_27 AC 2 ms
3,040 KB
testcase_28 AC 2 ms
3,036 KB
testcase_29 AC 2 ms
2,824 KB
testcase_30 AC 2 ms
2,876 KB
testcase_31 AC 2 ms
3,044 KB
testcase_32 AC 2 ms
3,036 KB
testcase_33 AC 2 ms
3,040 KB
testcase_34 AC 2,865 ms
4,192 KB
testcase_35 AC 2,878 ms
4,128 KB
testcase_36 AC 2,873 ms
4,240 KB
testcase_37 AC 2,877 ms
4,128 KB
testcase_38 AC 1 ms
2,872 KB
testcase_39 AC 1 ms
3,032 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#pragma GCC optimize "O3"
#pragma GCC target "tune=native"
#pragma GCC target "avx"
#include <cstdio>
#include <algorithm>
#include <immintrin.h>
#define repeat(i,n) for (int i = 0; (i) < int(n); ++(i))
using namespace std;
template <class T> inline T sq(T x) { return x*x; }
constexpr int max_n = 100000;
constexpr int r = 10;
__attribute__((aligned(32))) int32_t x[max_n];
__attribute__((aligned(32))) int32_t y[max_n];
__attribute__((aligned(32))) int32_t z[max_n]; // is_removed
int main() {
    int n; scanf("%d", &n);
    repeat (i,n) scanf("%d%d", &x[i], &y[i]);
    int i = 0;
    for (; i+3 < n; i += 4) {
        const __m128i xi = _mm_load_si128((__m128i *)(x + i));
        const __m128i yi = _mm_load_si128((__m128i *)(y + i));
        __m128i zi = _mm_setzero_si128();
        repeat (j,i) {
            __m128i xj = _mm_set1_epi32(x[j]);
            __m128i yj = _mm_set1_epi32(y[j]);
            __m128i zj = _mm_set1_epi32(not z[j]);
            xj = _mm_sub_epi32(xj, xi);
            yj = _mm_sub_epi32(yj, yi);
            xj = _mm_mullo_epi32(xj, xj);
            yj = _mm_mullo_epi32(yj, yj);
            const __m128i d = _mm_add_epi32(xj, yj);
            const __m128i e = _mm_set1_epi32(sq(r + r));
            __m128i cmp = _mm_cmplt_epi32(d, e);
            zi = _mm_add_epi32(zi, _mm_mullo_epi32(cmp, zj));
        }
        _mm_store_si128((__m128i *)(z + i), zi);
        repeat (di, 4) {
            if (z[i+di]) {
                z[i+di] = 1;
            } else {
                repeat (dj, di) {
                    if (not z[i+dj] and sq(x[i+dj] - x[i+di]) + sq(y[i+dj] - y[i+di]) < sq(r + r) ) {
                        z[i+di] = 1;
                        break;
                    }
                }
            }
        }
    }
    for (; i < n; ++ i) {
        repeat (j,i) {
            if (not z[j] and sq(x[j] - x[i]) + sq(y[j] - y[i]) < sq(r + r) ) {
                z[i] = 1;
                break;
            }
        }
    }
    int cnt = count(z, z + n, 0);
    printf("%d\n", cnt);
    return 0;
}
0