結果
問題 | No.1028 闇討ち |
ユーザー | marurunn11 |
提出日時 | 2020-05-01 21:06:29 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 3,714 bytes |
コンパイル時間 | 5,859 ms |
コンパイル使用メモリ | 219,696 KB |
実行使用メモリ | 35,744 KB |
最終ジャッジ日時 | 2024-06-07 01:09:01 |
合計ジャッジ時間 | 14,908 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
13,756 KB |
testcase_01 | AC | 2 ms
6,812 KB |
testcase_02 | AC | 2 ms
6,812 KB |
testcase_03 | AC | 2 ms
6,944 KB |
testcase_04 | AC | 2 ms
6,944 KB |
testcase_05 | AC | 2 ms
6,940 KB |
testcase_06 | AC | 3 ms
6,940 KB |
testcase_07 | AC | 2 ms
6,940 KB |
testcase_08 | AC | 2 ms
6,944 KB |
testcase_09 | AC | 29 ms
6,944 KB |
testcase_10 | AC | 48 ms
6,940 KB |
testcase_11 | AC | 310 ms
9,472 KB |
testcase_12 | TLE | - |
testcase_13 | TLE | - |
testcase_14 | AC | 1,053 ms
19,584 KB |
testcase_15 | AC | 204 ms
8,320 KB |
testcase_16 | TLE | - |
testcase_17 | -- | - |
testcase_18 | -- | - |
testcase_19 | -- | - |
testcase_20 | -- | - |
testcase_21 | -- | - |
ソースコード
#define _GLIBCXX_DEBUG #include "bits/stdc++.h" //#include <intrin.h> //AtCoder (gcc) 上ではこれがあると動かない。__popcnt用のincludeファイル。 using namespace std; using Graph = vector<vector<int>>; typedef long long ll; typedef long double ld; #define int long long #define rep(i, n) for(long long i = 0; i < (n); i++) #define sqrt(d) pow((long double) (d), 0.50) const int INF = 2e9; const ll large_P = 1e9 + 7; //繰り返し2乗法 //N^aの、Mで割った余りを求める。 ll my_pow(ll N, ll a, ll M) { ll tempo; if (a == 0) { return 1; } else { if (a % 2 == 0) { tempo = my_pow(N, a / 2, M); return (tempo * tempo) % M; } else { tempo = my_pow(N, a - 1, M); return (tempo * N) % M; } } } //N_C_a を M で割った余り ll my_combination(ll N, ll a, ll M) { ll answer = 1; rep(i, a) { answer *= (N - i); answer %= M; } rep(i, a) { answer *= my_pow(i + 1, M - 2, M); answer %= M; } return answer; } ll my_gcd(ll& a, ll& b) { if (b == 0) return a; ll temp = a % b; return my_gcd(b, temp); } // long long型 n を、base 進法での、i 桁目の数が入った vector にする。 void ll_to_vector(ll base, ll n, vector<ll>& v) { ll tempo = n; ll n_digit = floor(log10(n) / log10(base)) + 1; v.assign(n_digit, 0); //ll n_digit = v.size(); for (ll i = 0; i < n_digit; i++) { v.at(i) = tempo / pow(base, n_digit - 1 - i); tempo -= v.at(i) * pow(base, n_digit - 1 - i); } } int char_to_int(char c) { switch (c) { case '0': return 0; case '1': return 1; case '2': return 2; case '3': return 3; case '4': return 4; case '5': return 5; case '6': return 6; case '7': return 7; case '8': return 8; case '9': return 9; default: return 0; } } //エラトステネスの篩で、prime で ないところに false を入れる。 //true で初期化された vector を代入する必要がある。 void prime_judge(vector<bool>& prime_or_not) { prime_or_not.at(0) = false; prime_or_not.at(1) = false; ll n = prime_or_not.size() - 1; ll region = sqrt(n) + 1; for (ll i = 2; i <= n / 2; i++) { prime_or_not.at(2 * i) = false; } for (ll i2 = 1; i2 < n / 2; i2++) { ll i = 2 * i2 + 1; //ここからは奇数のみ探索 if (i < region && prime_or_not.at(i)) { ll j = i * i; while (j < n + 1) { prime_or_not.at(j) = false; j += 2 * i; } } } }; map<int, int> divide_to_prime(int target) { map<int, int> res; //sqrt(target) まで調べる。 int upper_lim = ceil(sqrt(target)); vector<bool> prime_or_not(upper_lim + 1, true); if (upper_lim < 20) prime_or_not.assign(25, true); prime_judge(prime_or_not); int tempo = target; rep(i, upper_lim + 1) { if (prime_or_not.at(i)) { while (tempo % i == 0) { tempo /= i; res[i]++; } } } if (tempo != 1) res[tempo]++; //sqrt(target) より大きな素因数は高々1つしかない。 return res; } signed main() { int N; cin >> N; vector<vector<int>> A(N, vector<int>(N)); vector<vector<pair<int, int>>> home(N); // i 番目の 要素は、i番目の社員の家の座標 (N個) rep(i, N) { rep(j, N) { cin >> A.at(i).at(j); A.at(i).at(j)--; home.at(A.at(i).at(j)).push_back(make_pair(i, j)); } } vector<int> move(N, INF); rep(i, N) { //座標 (i, 0) に居る。 //j番目の社員に対して、ドローンの移動回数 rep(j, N) { int move_times = 0; //k番目の家に対して rep(k, N) { move_times += max(abs(home.at(j).at(k).first - i), abs(home.at(j).at(k).second - 0)); } if (move_times < move.at(j)) move.at(j) = move_times; } } int res = 0; rep(j, N) { res += move.at(j); } cout << res << endl; }