結果
問題 |
No.1245 ANDORゲーム(calc)
|
ユーザー |
![]() |
提出日時 | 2025-03-20 20:59:59 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 427 ms / 2,000 ms |
コード長 | 2,138 bytes |
コンパイル時間 | 162 ms |
コンパイル使用メモリ | 82,528 KB |
実行使用メモリ | 168,952 KB |
最終ジャッジ日時 | 2025-03-20 21:00:46 |
合計ジャッジ時間 | 10,305 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 25 |
ソースコード
def main(): import sys input = sys.stdin.read data = input().split() idx = 0 N = int(data[idx]) Q = int(data[idx+1]) idx +=2 A = list(map(int, data[idx:idx+N])) idx +=N S = data[idx] idx +=1 t_list = list(map(int, data[idx:idx+Q])) idx +=Q max_bit = 30 # since A_i and t_i can be up to 1e9 which is <2^30 # Precompute operations: convert to list of 0 or 1 (AND/OR) ops = [0]*N for i in range(N): ops[i] = 0 if S[i] == '0' else 1 # Precompute each bit's A values for all operations # A_bits[b][i] = (A[i] >> b) & 1 A_bits = [ [0]*N for _ in range(max_bit+1) ] for b in range(max_bit+1): mask = 1 << b for i in range(N): A_bits[b][i] = (A[i] & mask) != 0 # For each bit b, precompute sum_delta for initial 0 and 1 bit_scores = [[0, 0] for _ in range(max_bit+1)] for b in range(max_bit+1): # Initial x=0 current = 0 sum_delta0 = 0 for i in range(N): a = A_bits[b][i] op = ops[i] prev = current if op == 0: current = prev & a else: current = prev | a sum_delta0 += abs(current - prev) # Initial x=1 current = 1 sum_delta1 = 0 for i in range(N): a = A_bits[b][i] op = ops[i] prev = current if op == 0: current = prev & a else: current = prev | a sum_delta1 += abs(current - prev) multiplier = 1 << b bit_scores[b][0] = sum_delta0 * multiplier bit_scores[b][1] = sum_delta1 * multiplier # Process each query results = [] for t in t_list: total = 0 for b in range(max_bit+1): if t & (1 << b): total += bit_scores[b][1] else: total += bit_scores[b][0] results.append(total) print('\n'.join(map(str, results))) if __name__ == "__main__": main()