C++の練習を兼ねて, AtCoder Regular Contest 092 の 問題D (Two Sequences) を解いてみた.
■感想.
1. 問題Dは, 方針が見えなかったので, 解説を参考にして, ようやく, AC版に到達出来た.
2. 引き続き, 時間を見つけて, 過去問の学習を進めていきたいと思う.
本家のサイト AtCoder Regular Contest 092 解説 を ご覧下さい.
■C++版プログラム(問題D/AC版).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
// 解き直し. // https://img.atcoder.jp/arc092/editorial.pdf // C++(GCC 9.2.1) #include <bits/stdc++.h> using namespace std; using LL = long long; using vl = vector<LL>; #define repex(i, a, b, c) for(int i = a; i < b; i += c) #define repx(i, a, b) repex(i, a, b, 1) #define rep(i, n) repx(i, 0, n) #define repr(i, a, b) for(int i = a; i >= b; i--) #define pb push_back LL a[202020], b[202020]; int main(){ // 1. 入力情報. int N; scanf("%d", &N); rep(i, N) scanf("%lld", &a[i]); rep(i, N) scanf("%lld", &b[i]); // 2. 2 の 冪乗 を 保存. vl cPow2; int count = 0; cPow2.pb(1); while(count < 32){ // 2-1. 最大値を2倍. LL p = 2 * cPow2.back(); // 2-2. 保存. cPow2.pb(p); // 2-3. インクリメント. count++; } // for(auto &p : cPow2) printf("%lld\n", p); // 3. 集計. LL ans = 0; rep(k, 31){ // 3-1. k-bit目をチェック. LL T = cPow2[k]; // 3-2. mod版作成. LL ma[202020], mb[202020]; rep(i, 202020) ma[i] = mb[i] = 0; rep(i, N){ ma[i] = (a[i] % (T * 2)); mb[i] = (b[i] % (T * 2)); } // 3-3. sort. sort(mb, mb + N); // 3-4. 該当する区間で検索. LL one = 0; rep(i, N){ LL d1 = 1 * T - ma[i]; LL d2 = 2 * T - ma[i]; LL d3 = 3 * T - ma[i]; LL d4 = 4 * T - ma[i]; // 区間[T - ma[i], 2 * T - ma[i]) int lAt = lower_bound(mb, mb + N, d1) - mb; int rAt = lower_bound(mb, mb + N, d2) - mb; one += rAt - lAt; // 区間[3 * T - ma[i], 4 * T - ma[i]) lAt = lower_bound(mb, mb + N, d3) - mb; rAt = lower_bound(mb, mb + N, d4) - mb; one += rAt - lAt; } // 3-5. k-bit目 を 反映. if(one & 1) ans += T; } // 4. 出力. printf("%lld\n", ans); return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
[入力例] 2 1 2 3 4 [出力例] 2 ※AtCoderテストケースより [入力例] 6 4 6 0 0 3 3 0 5 6 5 0 3 [出力例] 8 ※AtCoderテストケースより [入力例] 5 1 2 3 4 5 1 2 3 4 5 [出力例] 2 ※AtCoderテストケースより [入力例] 1 0 0 [出力例] 0 ※AtCoderテストケースより [入力例] 10 85 80 6 116 70 97 101 116 60 120 5 83 104 77 109 44 101 62 111 48 [出力例] 176 [入力例] 25 220 389 200 211 229 489 722 289 827 296 570 348 1 1084 592 469 1014 190 675 770 906 700 492 183 16 1165 809 1120 505 31 1209 1213 245 699 253 279 577 764 176 86 117 614 910 510 418 367 115 739 16 641 [出力例] 2978 |
■参照サイト
AtCoder Regular Contest 092