結果
問題 | No.2974 関数の芽 |
ユーザー | hiro1729 |
提出日時 | 2023-12-16 19:19:52 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,010 ms / 2,000 ms |
コード長 | 2,000 bytes |
コンパイル時間 | 232 ms |
コンパイル使用メモリ | 82,372 KB |
実行使用メモリ | 175,884 KB |
最終ジャッジ日時 | 2024-09-22 19:30:07 |
合計ジャッジ時間 | 10,851 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 42 ms
54,520 KB |
testcase_01 | AC | 50 ms
55,096 KB |
testcase_02 | AC | 42 ms
54,944 KB |
testcase_03 | AC | 43 ms
55,868 KB |
testcase_04 | AC | 42 ms
55,316 KB |
testcase_05 | AC | 45 ms
55,296 KB |
testcase_06 | AC | 44 ms
55,588 KB |
testcase_07 | AC | 45 ms
55,588 KB |
testcase_08 | AC | 45 ms
55,304 KB |
testcase_09 | AC | 48 ms
60,596 KB |
testcase_10 | AC | 44 ms
56,240 KB |
testcase_11 | AC | 56 ms
65,184 KB |
testcase_12 | AC | 97 ms
76,312 KB |
testcase_13 | AC | 347 ms
83,048 KB |
testcase_14 | AC | 379 ms
84,184 KB |
testcase_15 | AC | 877 ms
175,636 KB |
testcase_16 | AC | 508 ms
174,740 KB |
testcase_17 | AC | 899 ms
175,380 KB |
testcase_18 | AC | 838 ms
175,688 KB |
testcase_19 | AC | 810 ms
175,384 KB |
testcase_20 | AC | 862 ms
175,512 KB |
testcase_21 | AC | 892 ms
175,780 KB |
testcase_22 | AC | 1,010 ms
175,800 KB |
testcase_23 | AC | 999 ms
175,884 KB |
ソースコード
from collections import defaultdict from bisect import bisect_left as bsl class RangeAddSegTree: def __init__(self, n): self.l = 1 << (n - 1).bit_length() self.t = ([0] * self.l + [0] * n + [0] * (self.l - n)) def add(self, l, r, x): l += self.l r += self.l while l < r: if l & 1: self.t[l] = x + self.t[l] l += 1 if r & 1: self.t[r - 1] = x + self.t[r - 1] r -= 1 l >>= 1 r >>= 1 def get(self, x): x += self.l res = 0 while x > 0: res = res + self.t[x] x >>= 1 return res Q = int(input()) K = [0] * Q L = [0] * Q M = [0] * Q N = [0] * Q X = [0] * Q Xs = set() for i in range(Q): K[i], L[i], M[i], N[i], X[i] = map(int, input().split()) Xs.add(X[i]) Xs = list(Xs) Xs.sort() lx = len(Xs) Xt = defaultdict(int) for i in range(lx): Xt[Xs[i]] = i FL = [RangeAddSegTree(lx) for _ in range(2)] FR = [RangeAddSegTree(lx) for _ in range(2)] GL = [RangeAddSegTree(lx) for _ in range(2)] GR = [RangeAddSegTree(lx) for _ in range(2)] for k, l, m, n, x in zip(K, L, M, N, X): if k == 0: FL[0].add(0, lx, max(0, l)) FR[0].add(0, lx, max(0, l)) else: if k > 0: b1 = bsl(Xs, (k - l) // k) b2 = bsl(Xs, (-l + k - 1) // k) FL[0].add(b1, lx, l) FL[1].add(b1, lx, k) FR[0].add(b2, lx, l) FR[1].add(b2, lx, k) else: b1 = bsl(Xs, (l - k) // (-k)) b2 = bsl(Xs, (l - k - 1) // (-k)) FL[0].add(0, b1, l) FL[1].add(0, b1, k) FR[0].add(0, b2, l) FR[1].add(0, b2, k) if m == 0: GL[0].add(0, lx, max(0, n)) GR[0].add(0, lx, max(0, n)) else: if m > 0: b1 = bsl(Xs, (m - n) // m) b2 = bsl(Xs, (-n + m - 1) // m) GL[0].add(b1, lx, n) GL[1].add(b1, lx, m) GR[0].add(b2, lx, n) GR[1].add(b2, lx, m) else: b1 = bsl(Xs, (n - m) // (-m)) b2 = bsl(Xs, (n - m - 1) // (-m)) GL[0].add(0, b1, n) GL[1].add(0, b1, m) GR[0].add(0, b2, n) GR[1].add(0, b2, m) p = Xt[x] print("Yes" if FL[0].get(p) == GL[0].get(p) and FL[1].get(p) == GL[1].get(p) and FR[1].get(p) == GR[1].get(p) else "No")