結果

問題 No.2421 entersys?
ユーザー miya145592miya145592
提出日時 2023-08-12 14:34:30
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 1,671 ms / 3,000 ms
コード長 2,784 bytes
コンパイル時間 365 ms
コンパイル使用メモリ 82,240 KB
実行使用メモリ 264,396 KB
最終ジャッジ日時 2024-11-19 20:12:53
合計ジャッジ時間 24,726 ms
ジャッジサーバーID
(参考情報)
judge2 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 42 ms
52,864 KB
testcase_01 AC 59 ms
62,964 KB
testcase_02 AC 84 ms
72,432 KB
testcase_03 AC 47 ms
54,400 KB
testcase_04 AC 59 ms
62,720 KB
testcase_05 AC 77 ms
68,352 KB
testcase_06 AC 74 ms
68,608 KB
testcase_07 AC 77 ms
69,376 KB
testcase_08 AC 81 ms
71,040 KB
testcase_09 AC 109 ms
76,800 KB
testcase_10 AC 72 ms
67,072 KB
testcase_11 AC 1,099 ms
226,752 KB
testcase_12 AC 1,114 ms
227,476 KB
testcase_13 AC 1,115 ms
227,708 KB
testcase_14 AC 1,132 ms
227,656 KB
testcase_15 AC 1,100 ms
227,144 KB
testcase_16 AC 1,112 ms
219,892 KB
testcase_17 AC 1,098 ms
215,652 KB
testcase_18 AC 1,109 ms
216,268 KB
testcase_19 AC 1,102 ms
216,044 KB
testcase_20 AC 1,098 ms
215,236 KB
testcase_21 AC 942 ms
203,892 KB
testcase_22 AC 929 ms
222,552 KB
testcase_23 AC 1,295 ms
264,212 KB
testcase_24 AC 1,272 ms
264,376 KB
testcase_25 AC 1,290 ms
264,396 KB
testcase_26 AC 1,651 ms
224,276 KB
testcase_27 AC 1,639 ms
224,148 KB
testcase_28 AC 1,671 ms
227,456 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

# https://nagiss.hateblo.jp/entry/2019/07/01/185421
class Bit:
    def __init__(self, n):
        self.size = n
        self.tree = [0]*(n+1)

    def __iter__(self):
        psum = 0
        for i in range(self.size):
            csum = self.sum(i+1)
            yield csum - psum
            psum = csum
        raise StopIteration()

    def __str__(self):  # O(nlogn)
        return str(list(self))

    def sum(self, i):
        # [0, i) の要素の総和を返す
        if not (0 <= i <= self.size): raise ValueError("error!")
        s = 0
        while i>0:
            s += self.tree[i]
            i -= i & -i
        return s

    def add(self, i, x):
        if not (0 <= i < self.size): raise ValueError("error!")
        i += 1
        while i <= self.size:
            self.tree[i] += x
            i += i & -i

    def __getitem__(self, key):
        if not (0 <= key < self.size): raise IndexError("error!")
        return self.sum(key+1) - self.sum(key)

    def __setitem__(self, key, value):
        # 足し算と引き算にはaddを使うべき
        if not (0 <= key < self.size): raise IndexError("error!")
        self.add(key, value - self[key])

import bisect

N = int(input())
XLR = [input().split() for _ in range(N)]
T = set()
X = dict()
for x, l, r in XLR:
    l = int(l)
    r = int(r)
    T.add(l)
    T.add(r)
    if x not in X:
        X[x] = []
    bisect.insort_left(X[x], l)
    bisect.insort_left(X[x], r)

Q = int(input())
query = [input().split() for _ in range(Q)]
for q in query:
    tp = q[0]
    if tp=="1":
        x = q[1]
        t = int(q[2])
        T.add(t)
    elif  tp=="2":
        t = int(q[1])
        T.add(t)
    else:
        x = q[1]
        l = int(q[2])
        r = int(q[3])
        T.add(l)
        T.add(r)

T = list(T)
T.sort()
Z = dict()
for i, t in enumerate(T):
    Z[t] = i

BIT = Bit(len(T)+1)
for x, l, r in XLR:
    l=int(l)
    r=int(r)
    BIT.add(Z[l], 1)
    BIT.add(Z[r]+1, -1)

for q in query:
    tp = q[0]
    if tp=="1":
        x = q[1]
        t = int(q[2])
        if x not in X:
            print("No")
        else:
            pos = bisect.bisect_left(X[x], t)
            if pos==len(X[x]):
                print("No")
            else:
                if pos%2==0:
                    if X[x][pos]==t:
                        print("Yes")
                    else:
                        print("No")
                else:
                    print("Yes")
    elif  tp=="2":
        t = int(q[1])
        ans = BIT.sum(Z[t]+1)
        print(ans)
    else:
        x = q[1]
        l = int(q[2])
        r = int(q[3])
        BIT.add(Z[l], 1)
        BIT.add(Z[r]+1, -1)

        if x not in X:
            X[x] = []
        bisect.insort_left(X[x], l)
        bisect.insort_left(X[x], r)
0