結果
問題 |
No.3041 非対称じゃんけん
|
ユーザー |
![]() |
提出日時 | 2025-03-01 16:36:21 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
TLE
|
実行時間 | - |
コード長 | 1,464 bytes |
コンパイル時間 | 308 ms |
コンパイル使用メモリ | 12,160 KB |
実行使用メモリ | 18,728 KB |
最終ジャッジ日時 | 2025-03-01 16:36:29 |
合計ジャッジ時間 | 7,310 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 20 TLE * 1 -- * 9 |
ソースコード
def solve(N, F, A, B, C): size = (F * N) // 64 + 1 # masks[i] は i ビット分 1 が立っているマスク masks = [(1 << i) - 1 for i in range(65)] # dp 初期化 dp = [0] * size nextdp = [0] * size # 初期位置の設定 (63 - A[0]の位置を立てる) dp[0] |= 1 << (63 - A[0]) dp[0] |= 1 << (63 - B[0]) dp[0] |= 1 << (63 - C[0]) # 最初のpopcount print(bin(dp[0]).count('1')) for k in range(1, N): a, b, c = A[k], B[k], C[k] # A[i] による遷移 nextdp[0] = dp[0] >> a for i in range(1, size): nextdp[i] = (dp[i] >> a) | ((dp[i-1] & masks[a]) << (64 - a)) # B[i] による遷移 nextdp[0] |= dp[0] >> b for i in range(1, size): nextdp[i] |= (dp[i] >> b) | ((dp[i-1] & masks[b]) << (64 - b)) # C[i] による遷移 nextdp[0] |= dp[0] >> c for i in range(1, size): nextdp[i] |= (dp[i] >> c) | ((dp[i-1] & masks[c]) << (64 - c)) # popcount ans = sum(bin(x).count('1') for x in nextdp) print(ans) # dpを更新 dp, nextdp = nextdp, [0] * size LMI=lambda:list(map(int, input().split())) LMS=lambda:list(map(str, input().split())) MI=lambda:map(int, input().split()) MS=lambda:map(str, input().split()) II=lambda:int(input()) IS=lambda:input().split() LI=lambda:list(input()) N,F=MI() A=LMI() B=LMI() C=LMI() solve(N, F, A, B, C)