結果
問題 |
No.3041 非対称じゃんけん
|
ユーザー |
|
提出日時 | 2025-03-01 10:08:40 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,547 bytes |
コンパイル時間 | 953 ms |
コンパイル使用メモリ | 88,820 KB |
実行使用メモリ | 8,360 KB |
最終ジャッジ日時 | 2025-03-01 10:08:55 |
合計ジャッジ時間 | 14,897 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 26 TLE * 4 |
ソースコード
#include <iostream> #include <vector> using namespace std; using ll = long long; // f+1ビットを64ビットブロックに分解したときのブロック数を計算 inline int getBlocks(int size) { return (size + 63) / 64; } // bits 配列を shiftVal ビット左にシフトした結果を返す vector<unsigned long long> shiftBits(const vector<unsigned long long>& bits, int shiftVal, int blocks) { vector<unsigned long long> res(blocks, 0ULL); int blockShift = shiftVal / 64; int bitShift = shiftVal % 64; for (int i = 0; i < blocks; i++) { if (bits[i] == 0) continue; int targetIndex = i + blockShift; if (targetIndex < blocks) { // シフトした後、下位側のシフト res[targetIndex] |= bits[i] << bitShift; } if (bitShift && targetIndex + 1 < blocks) { // 残りは次のブロックに繰り上がる部分 res[targetIndex + 1] |= bits[i] >> (64 - bitShift); } } return res; } // 3つのビット列の OR を取る vector<unsigned long long> orBits(const vector<unsigned long long>& A, const vector<unsigned long long>& B, const vector<unsigned long long>& C, int blocks) { vector<unsigned long long> res(blocks, 0ULL); for (int i = 0; i < blocks; i++) { res[i] = A[i] | B[i] | C[i]; } return res; } // 各ブロックのビットの立っている数をカウント ll countBits(const vector<unsigned long long>& bits) { ll cnt = 0; for (auto x : bits) cnt += __builtin_popcountll(x); return cnt; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); ll n, f; cin >> n >> f; vector<ll> a(n), b(n), c(n); for (ll i = 0; i < n; i++) { cin >> a[i]; } for (ll i = 0; i < n; i++) { cin >> b[i]; } for (ll i = 0; i < n; i++) { cin >> c[i]; } // 必要なビット数は f+1 に限定 int size = n*f + 1; int blocks = getBlocks(size); // 初期状態: 0番目だけ立っている vector<unsigned long long> cur(blocks, 0ULL); cur[0] = 1ULL; // 各操作ごとにシフト & OR を行い、状態のビット数を出力 for (ll i = 0; i < n; i++) { vector<unsigned long long> sA = shiftBits(cur, a[i], blocks); vector<unsigned long long> sB = shiftBits(cur, b[i], blocks); vector<unsigned long long> sC = shiftBits(cur, c[i], blocks); cur = orBits(sA, sB, sC, blocks); cout << countBits(cur) << "\n"; } return 0; }