結果
| 問題 |
No.202 1円玉投げ
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2017-03-14 21:47:44 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,071 bytes |
| コンパイル時間 | 1,821 ms |
| コンパイル使用メモリ | 149,560 KB |
| 実行使用メモリ | 6,824 KB |
| 最終ジャッジ日時 | 2024-12-22 10:55:17 |
| 合計ジャッジ時間 | 11,095 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 15 WA * 23 |
ソースコード
#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;
__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();
for (int j = 0; j < i; j += 4) {
__m128i xj = _mm_load_si128((__m128i *)(x + j));
__m128i yj = _mm_load_si128((__m128i *)(y + j));
__m128i zj = _mm_load_si128((__m128i *)(z + j));
xj = _mm_sub_epi32(xj, xi);
yj = _mm_sub_epi32(yj, yi);
xj = _mm_mul_epi32(xj, xj);
yj = _mm_mul_epi32(yj, yj);
const __m128i d = _mm_add_epi32(xj, yj);
const __m128i e = _mm_set1_epi32(400);
__m128i cmp = _mm_cmplt_epi32(d, e);
zi = _mm_add_epi32(zi, _mm_mul_epi32(cmp, zj));
}
_mm_store_si128((__m128i *)(z + i), zi);
repeat (di, 4) {
if (z[i+di]) z[i+di] = 1;
if (not z[i+di]) {
repeat (dj, di) {
if (not z[i+dj] and sq(x[i+dj] - x[i+di]) + sq(y[i+dj] - y[i+di]) < sq(10 + 10) ) {
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(10 + 10) ) {
z[i] = 1;
break;
}
}
}
int cnt = count(z, z + n, 0);
printf("%d\n", cnt);
return 0;
}