結果
問題 |
No.961 Vibrant Fillumination
|
ユーザー |
![]() |
提出日時 | 2025-03-31 17:45:49 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,524 bytes |
コンパイル時間 | 324 ms |
コンパイル使用メモリ | 82,376 KB |
実行使用メモリ | 131,192 KB |
最終ジャッジ日時 | 2025-03-31 17:47:03 |
合計ジャッジ時間 | 39,854 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 WA * 1 |
other | AC * 4 WA * 44 |
ソースコード
import sys def main(): input = sys.stdin.read data = input().split() ptr = 0 N = int(data[ptr]) ptr += 1 h = list(map(int, data[ptr:ptr + N])) ptr += N events = [] max_y = 0 for _ in range(N): a = int(data[ptr]) b = int(data[ptr + 1]) c = int(data[ptr + 2]) d = int(data[ptr + 3]) e = int(data[ptr + 4]) ptr +=5 if d > max_y: max_y = d # add event: when the rectangle starts hash_val = h[e-1] events.append( (a, 2, b, d, hash_val) ) # type 2 is add # remove event: when the rectangle ends events.append( (c, 0, b, d, hash_val) ) # type 0 is remove Q = int(data[ptr]) ptr +=1 queries = [] for q_idx in range(Q): p = int(data[ptr]) q = int(data[ptr + 1]) ptr +=2 x_query = p + 0.5 events.append( (x_query, 1, q, q_idx) ) # type 1 is query # sort events: events.sort(key=lambda x: (x[0], x[1])) class FenwickTree: def __init__(self, size): self.n = size self.tree = [0] * (self.n + 2) # 1-based indexing def update(self, idx, value): while idx <= self.n: self.tree[idx] ^= value idx += idx & -idx def query(self, idx): res = 0 while idx > 0: res ^= self.tree[idx] idx -= idx & -idx return res # The maximum possible y in Fenwick tree is max_y, which is d from rectangles, so up to 2N # Also, queries have q up to 2N-1, which when added 1 gives 2N. ft_size = 2 * N + 2 # to cover up to 2*N in b and d, which gives 2*N+1 in Fenwick index ft = FenwickTree(ft_size) ans = [0] * Q for event in events: x = event[0] type_code = event[1] if type_code == 2: # add b, d, h_val = event[2], event[3], event[4] pos_b = b + 1 pos_d = d + 1 ft.update(pos_b, h_val) ft.update(pos_d, h_val) elif type_code == 0: # remove b, d, h_val = event[2], event[3], event[4] pos_b = b + 1 pos_d = d + 1 ft.update(pos_b, h_val) ft.update(pos_d, h_val) elif type_code == 1: # query q, idx = event[2], event[3] pos = q + 1 res = ft.query(pos) ans[idx] = res for a in ans: print(a) if __name__ == "__main__": main()