結果
問題 | No.1239 Multiplication -2 |
ユーザー |
![]() |
提出日時 | 2025-03-26 15:57:02 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 195 ms / 2,000 ms |
コード長 | 3,276 bytes |
コンパイル時間 | 388 ms |
コンパイル使用メモリ | 81,920 KB |
実行使用メモリ | 138,272 KB |
最終ジャッジ日時 | 2025-03-26 15:57:31 |
合計ジャッジ時間 | 5,762 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 34 |
ソースコード
import sysMOD = 998244353def main():input = sys.stdin.read().split()N = int(input[0])a = list(map(int, input[1:N+1]))max_n = 2 * 10**5 + 10pow2 = [1] * (max_n + 1)for i in range(1, max_n + 1):pow2[i] = (pow2[i-1] * 2) % MODinv2 = pow(2, MOD-2, MOD)inv_pow2 = [1] * (max_n + 1)inv_pow2[1] = inv2for i in range(2, max_n + 1):inv_pow2[i] = (inv_pow2[i-1] * inv2) % MODruns = []current_run = []start = 0for i in range(N):if a[i] != 0:if not current_run:start = icurrent_run.append(a[i])else:if current_run:runs.append( (start, i-1, current_run) )current_run = []if current_run:runs.append( (start, N-1, current_run) )total = 0for (l, r, elements) in runs:m = len(elements)pos_list = []for idx in range(m):if abs(elements[idx]) == 2:pos_list.append(idx + 1)if not pos_list:continueprefix_parity = [0] * (m + 1)cnt = 0for i in range(m):if elements[i] < 0:cnt += 1prefix_parity[i+1] = cnt % 2sum0 = [0] * (m + 1)sum1 = [0] * (m + 1)run_start = l + 1for s in range(1, m + 1):if run_start >= 2:val = pow2[s-1]else:if s == 1:val = 2 % MODelse:val = pow2[s-1] % MODparity = prefix_parity[s-1]sum0[s] = sum0[s-1]sum1[s] = sum1[s-1]if parity == 0:sum0[s] = (sum0[s] + val) % MODelse:sum1[s] = (sum1[s] + val) % MODt = len(pos_list)for i in range(t):pos = pos_list[i]prev_pos = pos_list[i-1] if i > 0 else Nonenext_pos = pos_list[i+1] if i < t -1 else NoneL = 1if prev_pos is not None:L = prev_pos + 1R = mif next_pos is not None:R = next_pos - 1for e in range(pos, R + 1):parity_e = prefix_parity[e]desired_parity = 1 - parity_ea_s = Lb_s = possum_val = 0if a_s > b_s:continueif desired_parity == 0:sum_val = (sum0[b_s] - sum0[a_s - 1]) % MODelse:sum_val = (sum1[b_s] - sum1[a_s - 1]) % MODif sum_val < 0:sum_val += MODif r < N - 1:pow_term = e + 1else:if e < m:pow_term = e + 1else:pow_term = einv = inv_pow2[pow_term]contribution = (sum_val * inv) % MODtotal = (total + contribution) % MODprint(total % MOD)if __name__ == '__main__':main()