結果
問題 | No.482 あなたの名は |
ユーザー | @abcde |
提出日時 | 2019-05-25 17:50:13 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 65 ms / 2,000 ms |
コード長 | 1,681 bytes |
コンパイル時間 | 1,661 ms |
コンパイル使用メモリ | 171,148 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-09-17 15:05:54 |
合計ジャッジ時間 | 3,593 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,812 KB |
testcase_01 | AC | 2 ms
6,940 KB |
testcase_02 | AC | 2 ms
6,944 KB |
testcase_03 | AC | 2 ms
6,944 KB |
testcase_04 | AC | 2 ms
6,944 KB |
testcase_05 | AC | 2 ms
6,944 KB |
testcase_06 | AC | 2 ms
6,940 KB |
testcase_07 | AC | 2 ms
6,940 KB |
testcase_08 | AC | 2 ms
6,940 KB |
testcase_09 | AC | 1 ms
6,944 KB |
testcase_10 | AC | 2 ms
6,940 KB |
testcase_11 | AC | 2 ms
6,940 KB |
testcase_12 | AC | 2 ms
6,940 KB |
testcase_13 | AC | 2 ms
6,944 KB |
testcase_14 | AC | 2 ms
6,940 KB |
testcase_15 | AC | 62 ms
6,940 KB |
testcase_16 | AC | 65 ms
6,940 KB |
testcase_17 | AC | 64 ms
6,944 KB |
testcase_18 | AC | 61 ms
6,940 KB |
testcase_19 | AC | 62 ms
6,944 KB |
testcase_20 | AC | 65 ms
6,944 KB |
testcase_21 | AC | 65 ms
6,940 KB |
testcase_22 | AC | 64 ms
6,944 KB |
testcase_23 | AC | 62 ms
6,944 KB |
testcase_24 | AC | 61 ms
6,944 KB |
testcase_25 | AC | 64 ms
6,944 KB |
testcase_26 | AC | 61 ms
6,944 KB |
testcase_27 | AC | 59 ms
6,944 KB |
testcase_28 | AC | 60 ms
6,940 KB |
testcase_29 | AC | 61 ms
6,940 KB |
testcase_30 | AC | 2 ms
6,940 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; using LL = long long; LL io[200001]; LL oi[200001]; // 幅優先探索. // https://ja.wikipedia.org/wiki/幅優先探索 // 操作パターンを幅優先探索する. // ※bfsの動作確認用. // @param c: 探索地点のインデックス. // @param o: 操作回数. // @param o: 探索回数 を 返却. LL bfs(LL c, LL o){ // 1. 終了条件確認. LL ret = o; if(io[c] == c) return ret; // 2. 空のキュー. queue<LL> q; // 3. 訪問済みフラグ設定. // -> 特に設定しない. // io[c] = c; // 4. 探索地点 c をキュー q に追加. q.push(c); while(!q.empty()){ // 5. キューから取り出す. LL v = q.front(); q.pop(); // 6. 取り出した要素を処理. // 未訪問(io[v] != v) であれば, 以下の条件にしたがって, 訪問済みを設定. // cout << "io[" << v << "]=" << io[v] << " oi[" << v << "]=" << oi[v] << " ret=" << ret << endl; if(io[v] != v) q.push(oi[v]), io[oi[v]] = io[v], io[v] = v, ret++; } // 7. 探索回数 を 返却. return ret; } int main() { // 1. 入力情報取得. LL N, K; cin >> N >> K; for(LL i = 1; i < N + 1; i++){ LL d; cin >> d; io[i] = d, oi[d] = i; } // 2. K回の操作で戻せるか? LL count = 0; for(LL i = 1; i < N + 1; i++) count += bfs(i, 0); // 3. 判定. string ans = "NO"; LL diff = K - count; if(diff >= 0 && diff % 2 == 0) ans = "YES"; // 4. 後処理. cout << ans << endl; return 0; }