結果
| 問題 |
No.1245 ANDORゲーム(calc)
|
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 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()
lam6er