結果
問題 |
No.3041 非対称じゃんけん
|
ユーザー |
![]() |
提出日時 | 2025-03-04 19:13:29 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,052 bytes |
コンパイル時間 | 2,430 ms |
コンパイル使用メモリ | 197,596 KB |
実行使用メモリ | 12,448 KB |
最終ジャッジ日時 | 2025-03-04 19:13:38 |
合計ジャッジ時間 | 8,848 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 25 TLE * 1 -- * 4 |
ソースコード
#include <bits/stdc++.h> using namespace std; vector<uint64_t> shiftVec(const vector<uint64_t>& v, int s, int L) { int nblock = v.size(); vector<uint64_t> res(nblock, 0); int bs = s / 64; int r = s % 64; for (int i = nblock - 1; i >= 0; i--) { int j = i - bs; if(j < 0) continue; uint64_t cur = v[j] << r; uint64_t carry = 0; if(r && j > 0) carry = v[j-1] >> (64 - r); uint64_t val = cur | carry; res[i] |= val; } int full = L / 64; int rem = L % 64; if(full < nblock && rem != 0){ res[full] &= ((uint64_t)1 << rem) - 1; for (int i = full+1; i < nblock; i++) res[i] = 0; } return res; } void orVec(vector<uint64_t>& d, const vector<uint64_t>& s) { int n = d.size(); for (int i = 0; i < n; i++) d[i] |= s[i]; } int countVec(const vector<uint64_t>& v, int L) { int nblock = v.size(); int full = L / 64; int rem = L % 64; int cnt = 0; for (int i = 0; i < full; i++) cnt += __builtin_popcountll(v[i]); if(full < nblock && rem != 0){ uint64_t mask = ((uint64_t)1 << rem) - 1; cnt += __builtin_popcountll(v[full] & mask); } return cnt; } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int N, F; cin >> N >> F; vector<int> A(N), B(N), C(N); for (int i = 0; i < N; i++) cin >> A[i]; for (int i = 0; i < N; i++) cin >> B[i]; for (int i = 0; i < N; i++) cin >> C[i]; int max_sum = N * F; int L = max_sum + 1; int nblock = (L + 63) / 64; vector<uint64_t> dp(nblock, 0); dp[0] = 1; int cur = 0; for (int i = 0; i < N; i++){ cur += F; int Lnow = cur + 1; vector<uint64_t> ndp(nblock, 0); vector<uint64_t> t; t = shiftVec(dp, A[i], Lnow); orVec(ndp, t); t = shiftVec(dp, B[i], Lnow); orVec(ndp, t); t = shiftVec(dp, C[i], Lnow); orVec(ndp, t); dp.swap(ndp); cout << countVec(dp, Lnow) << endl; } return 0; }