結果

問題 No.3366 Reversible Tile:Revival
コンテスト
ユーザー LyricalMaestro
提出日時 2026-10-12 02:47:01
言語 PyPy3
(7.3.23 + ACL)
コンパイル:
pypy3 -mpy_compile _filename_
実行:
pypy3 _filename_
結果
AC  
実行時間 523 ms / 3,000 ms
+ 378µs
コード長 2,441 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 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
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

# 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()
0