結果
問題 |
No.961 Vibrant Fillumination
|
ユーザー |
![]() |
提出日時 | 2025-04-16 00:35:40 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,438 bytes |
コンパイル時間 | 508 ms |
コンパイル使用メモリ | 81,280 KB |
実行使用メモリ | 141,988 KB |
最終ジャッジ日時 | 2025-04-16 00:38:22 |
合計ジャッジ時間 | 34,725 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 WA * 1 |
other | AC * 4 WA * 44 |
ソースコード
import sys class FenwickTree: def __init__(self, size): self.n = size self.tree = [0] * (self.n + 2) # 1-based indexing def update_point(self, idx, val): while idx <= self.n: self.tree[idx] ^= val idx += idx & -idx def query_prefix(self, idx): res = 0 while idx > 0: res ^= self.tree[idx] idx -= idx & -idx return res def update_range(self, L, R, val): self.update_point(L, val) self.update_point(R + 1, val) def query_point(self, idx): return self.query_prefix(idx) def main(): input = sys.stdin.read().split() ptr = 0 N = int(input[ptr]) ptr +=1 h = list(map(int, input[ptr:ptr+N])) ptr +=N events = [] max_y = 0 for _ in range(N): a = int(input[ptr]) b = int(input[ptr+1]) c = int(input[ptr+2]) d = int(input[ptr+3]) e = int(input[ptr+4]) -1 # 0-based ptr +=5 x_start = a x_end = c -1 y_start = b y_end = d -1 if x_start > x_end or y_start > y_end: continue h_val = h[e] add_x = x_start remove_x = x_end +1 events.append( (add_x, 1, y_start, y_end, h_val) ) events.append( (remove_x, 0, y_start, y_end, h_val) ) max_y = max(max_y, y_end) Q = int(input[ptr]) ptr +=1 queries = [] for q_idx in range(Q): p = int(input[ptr]) q = int(input[ptr+1]) ptr +=2 queries.append( (p, q, q_idx) ) combined = [] for event in events: x, typ, y1, y2, val = event combined.append( (x, 0 if typ ==0 else 1, y1, y2, val) ) for p, q, q_idx in queries: combined.append( (p, 2, q, q_idx) ) combined.sort(key=lambda x: (x[0], x[1])) size_y = 2 * N ft = FenwickTree(size_y) res = [0] * Q for item in combined: x = item[0] if item[1] in (0, 1): typ = item[1] y1 = item[2] y2 = item[3] val = item[4] ft.update_range(y1 +1, y2 +1, val) else: q = item[2] q_idx = item[3] y = q +1 if y > size_y: xor_val = 0 else: xor_val = ft.query_point(y) res[q_idx] = xor_val for val in res: print(val) if __name__ == "__main__": main()