結果
| 問題 | No.3366 Reversible Tile:Revival |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-10-12 02:47:01 |
| 言語 | PyPy3 (7.3.23 + ACL) |
| 結果 |
AC
不安定
|
| 実行時間 | 523 ms / 3,000 ms |
| + 378µs | |
| コード長 | 2,441 bytes |
| 記録 | |
| コンパイル時間 | 1,002 ms |
| コンパイル使用メモリ | 81,280 KB |
| 実行使用メモリ | 210,688 KB |
| 最終ジャッジ日時 | 2026-10-12 02:47:33 |
| 合計ジャッジ時間 | 26,139 ms |
|
ジャッジサーバーID (参考情報) |
judge1_0 / judge3_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 45 |
ソースコード
# https://yukicoder.me/problems/no/3366
import random
MOD = 998244353
def main():
N, M = map(int, input().split())
lr = []
for _ in range(M):
l, r = map(int, input().split())
lr.append((l , r ))
# Zobrist_hash
hash_table = set()
while len(hash_table) < M:
hash_table.add(random.randint(1, 1 << 63))
zoblist_hash = list(hash_table)
# 座標圧縮
l_set = {1, N, N + 1}
for l, r in lr:
l_set.add(l)
l_set.add(r)
l_set.add(r + 1)
l_list = list(l_set)
l_list.sort()
l_map = {}
for i, l in enumerate(l_list):
l_map[l] = i
l_max = len(l_list)
# イベントソート
add_event = [[] for _ in range(l_max)]
remove_event = [[] for _ in range(l_max)]
for i in range(M):
l, r = lr[i]
l_ = l_map[l]
r_ = l_map[r]
add_event[l_].append(i)
remove_event[r_].append(i)
z_hash = 0
z_hash_count = {}
for i in range(l_max):
for index in add_event[i]:
z_hash ^= zoblist_hash[index]
count = 0
if i < l_max - 1:
count = l_list[i + 1] - l_list[i]
if z_hash not in z_hash_count:
z_hash_count[z_hash] = 0
z_hash_count[z_hash] += count
for index in remove_event[i]:
z_hash ^= zoblist_hash[index]
n = 0
for key, value in z_hash_count.items():
if key != 0:
n += value
ans2 = 0
for key, value in z_hash_count.items():
if key != 0:
c1 = value % MOD
c2 = (n - value ) % MOD
c3 = (c1 * c2) % MOD
c3 *= pow(4, MOD - 2, MOD)
c3 %= MOD
c1 = value % MOD
c2 = (value - 1) % MOD
c4 = (c1 * c2) % MOD
c4 *= pow(2, MOD - 2, MOD)
c4 %= MOD
ans2 += (c3 + c4) % MOD
ans2 %= MOD
else:
n0 = N - value
c0 = (2 * n0 * value) % MOD
c0 *= pow(2, MOD -2, MOD)
c0 %= MOD
c0 += (pow(value, 2, MOD) - value) % MOD
c0 %= MOD
ans2 += c0
ans2 %= MOD
answer = (n * pow(2, MOD -2, MOD)) % MOD
answer %= MOD
answer += (N - n)
answer %= MOD
answer += ans2
answer %= MOD
answer *= pow(2, M, MOD)
answer %= MOD
print(answer)
if __name__ == "__main__":
main()