結果
| 問題 |
No.3366 Reversible Tile:Revival
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-11-17 23:20:12 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 655 ms / 3,000 ms |
| コード長 | 1,783 bytes |
| コンパイル時間 | 155 ms |
| コンパイル使用メモリ | 82,640 KB |
| 実行使用メモリ | 191,024 KB |
| 最終ジャッジ日時 | 2025-11-17 23:20:36 |
| 合計ジャッジ時間 | 21,837 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 45 |
ソースコード
import sys
input = lambda :sys.stdin.readline()[:-1]
ni = lambda :int(input())
na = lambda :list(map(int,input().split()))
yes = lambda :print("yes");Yes = lambda :print("Yes");YES = lambda : print("YES")
no = lambda :print("no");No = lambda :print("No");NO = lambda : print("NO")
#######################################################################
"""
f(S) = (\sum_i s[i] == 1) ^ 2
x がオンになっている確率は 1/2 (一個も区間に被ってない時は 0 )
x, y がともに 1 となる確率
両方 ある区間が被ってないといけない
S(x), S(y), T(x, y)
S(x) == 0 and S(y) == 0 T(x, y) > 0 のときは 1/2
S(x) > 0 and S(y) > 0 のときは 1/4
"""
n, m = na()
l, r = zip(*[na() for i in range(m)])
l = [i-1 for i in l]
r = list(r)
s = sorted(set([0] + l + list(r) + [n]))
d = {x:i for i, x in enumerate(s)}
for i in range(m):
l[i] = d[l[i]]
r[i] = d[r[i]]
N = len(s)
rui1 = [0] * (N + 1)
rui2 = [0] * (N + 1)
from random import randint
f = [randint(1, 10 ** 20) for i in range(m)]
for i in range(m):
rui1[l[i]] += 1
rui1[r[i]] -= 1
rui2[l[i]] += f[i]
rui2[r[i]] -= f[i]
for i in range(N):
rui1[i+1] += rui1[i]
rui2[i+1] += rui2[i]
# print(s)
# print(rui1)
# print(rui2)
from collections import defaultdict
ans = 0
mod = 998244353
m2 = pow(2, mod-2, mod)
dic = defaultdict(int)
M = 0
L = 0
for i in range(N-1):
d = s[i+1] - s[i]
if rui1[i]:
# ans += d * m2
# ans %= mod
dic[rui2[i]] += d
M += d
else:
L += d
# 同じときは 1/2
K = 0
for i in dic:
# print(i, dic[i])
K += dic[i] * dic[i]
# print(M, K, L)
print((L * L + L * M + M * M * m2 * m2 + K * m2 * m2)* pow(2, m, mod) % mod)
# 1, 3, 4
# 1 * 1 / 2 + 1 * 3 / 2
# 違うときは 1/4