結果

問題 No.2611 Count 01
ユーザー MitarushiMitarushi
提出日時 2024-01-19 17:52:45
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 5,530 ms / 6,000 ms
コード長 2,847 bytes
コンパイル時間 487 ms
コンパイル使用メモリ 82,176 KB
実行使用メモリ 233,952 KB
最終ジャッジ日時 2024-09-28 03:41:51
合計ジャッジ時間 109,068 ms
ジャッジサーバーID
(参考情報)
judge1 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 42 ms
53,120 KB
testcase_01 AC 41 ms
52,736 KB
testcase_02 AC 53 ms
63,232 KB
testcase_03 AC 5,171 ms
233,452 KB
testcase_04 AC 5,356 ms
233,648 KB
testcase_05 AC 5,394 ms
233,612 KB
testcase_06 AC 5,474 ms
233,228 KB
testcase_07 AC 5,258 ms
233,280 KB
testcase_08 AC 5,349 ms
233,436 KB
testcase_09 AC 5,389 ms
233,344 KB
testcase_10 AC 5,477 ms
232,520 KB
testcase_11 AC 5,262 ms
233,496 KB
testcase_12 AC 5,152 ms
232,932 KB
testcase_13 AC 5,249 ms
233,952 KB
testcase_14 AC 5,261 ms
233,088 KB
testcase_15 AC 5,396 ms
233,616 KB
testcase_16 AC 5,530 ms
233,596 KB
testcase_17 AC 5,381 ms
233,716 KB
testcase_18 AC 5,222 ms
233,004 KB
testcase_19 AC 5,314 ms
233,504 KB
testcase_20 AC 5,277 ms
233,376 KB
testcase_21 AC 5,382 ms
233,800 KB
testcase_22 AC 5,416 ms
233,376 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

import array

class SegmentTree:
    def __init__(self, n, e):
        n2 = 1
        while n2 < n:
            n2 *= 2
        self.n = n2
        self.data = [e] * (n2 * 2)

    def build(self, a):
        for i, x in enumerate(a):
            self.data[i + self.n] = x
        for i in range(self.n - 1, 0, -1):
            self.data[i] = self.data[i * 2] + self.data[i * 2 + 1]

    def update(self, i, x):
        k = i + self.n
        self.data[k] = x
        while k > 1:
            k //= 2
            self.data[k] = self.data[k * 2] + self.data[k * 2 + 1]

    def query(self, l, r, ls, rs):
        l += self.n
        r += self.n
        while l < r:
            if l & 1:
                ls += self.data[l]
                l += 1
            if r & 1:
                r -= 1
                rs = self.data[r] + rs
            l //= 2
            r //= 2
        return ls + rs


MOD = 998244353

class Vec:
    def __init__(self, a):
        self.a = a

    def __add__(self, other):
        if isinstance(other, Matrix):
            result = self.a[:]
            for i in range(len(self.a)):
                for j in range(i):
                    result[j] += self.a[i] * other.a[i * (i - 1) // 2 + j]
            for i in range(len(self.a)):
                result[i] %= MOD
            return Vec(result)
        return sum(x * y for x, y in zip(self.a, other.a)) % MOD

class Matrix:
    size = 6
    def __init__(self, a):
        self.a = a

    def __add__(self, other):
        if isinstance(other, Vec):
            result = other.a[:]
            for i in range(self.size):
                for j in range(i):
                    result[i] += self.a[i * (i - 1) // 2 + j] * other.a[j]
                result[i] %= MOD
            return Vec(result)
        result = array.array('l', [i + j for i, j in zip(self.a, other.a)])
        for i in range(self.size):
            for j in range(i):
                ij = i * (i - 1) // 2 + j
                for k in range(j + 1, i):
                    result[ij] += self.a[i * (i - 1) // 2 + k] * other.a[k * (k - 1) // 2 + j]
                result[ij] %= MOD
        return Matrix(result)

node = [
    Matrix(array.array('l', [1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1])),
    Matrix(array.array('l', [1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1])),
]

identity = Matrix(array.array('l', [0] * 15))


n, q = map(int, input().split())
s = input()
s_seq = [int(x) for x in s]
st = SegmentTree(n, identity)
st.build([node[x] for x in s_seq])
for _ in range(q):
    t, *args = map(int, input().split())
    if t == 1:
        i = args[0] - 1
        s_seq[i] = 1 - s_seq[i]
        st.update(i, node[s_seq[i]])
    else:
        l, r = args
        ans = st.query(l - 1, r, Vec(array.array('l', [0, 0, 0, 0, 0, 1])), Vec(array.array('l', [1, 0, 0, 0, 0, 0])))
        print(ans)
0