結果
問題 |
No.2321 Continuous Flip
|
ユーザー |
![]() |
提出日時 | 2025-04-09 20:56:09 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 3,800 bytes |
コンパイル時間 | 340 ms |
コンパイル使用メモリ | 82,296 KB |
実行使用メモリ | 55,340 KB |
最終ジャッジ日時 | 2025-04-09 20:57:41 |
合計ジャッジ時間 | 7,766 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | TLE * 1 -- * 29 |
ソースコード
import sys import heapq class SegmentTreeNode: def __init__(self, left, right): self.left = left self.right = right self.even_sum = 0 self.odd_sum = 0 self.flipped = False self.left_child = None self.right_child = None class SegmentTree: def __init__(self, data): self.n = len(data) self.root = self.build_tree(data, 0, self.n - 1) def build_tree(self, data, l, r): node = SegmentTreeNode(l, r) if l == r: node.even_sum = data[l] node.odd_sum = 0 return node mid = (l + r) // 2 node.left_child = self.build_tree(data, l, mid) node.right_child = self.build_tree(data, mid + 1, r) node.even_sum = node.left_child.even_sum + node.right_child.even_sum node.odd_sum = node.left_child.odd_sum + node.right_child.odd_sum return node def push_down(self, node): if node.flipped and node.left_child: node.left_child.flipped = not node.left_child.flipped node.left_child.even_sum, node.left_child.odd_sum = node.left_child.odd_sum, node.left_child.even_sum node.right_child.flipped = not node.right_child.flipped node.right_child.even_sum, node.right_child.odd_sum = node.right_child.odd_sum, node.right_child.even_sum node.flipped = False def flip_range(self, l, r): self._flip_range(self.root, l, r) def _flip_range(self, node, l, r): if node.right < l or node.left > r: return if l <= node.left and node.right <= r: node.even_sum, node.odd_sum = node.odd_sum, node.even_sum node.flipped = not node.flipped return self.push_down(node) self._flip_range(node.left_child, l, r) self._flip_range(node.right_child, l, r) node.even_sum = node.left_child.even_sum + node.right_child.even_sum node.odd_sum = node.left_child.odd_sum + node.right_child.odd_sum def query_sum(self, l, r): return self._query_sum(self.root, l, r) def _query_sum(self, node, l, r): if node.right < l or node.left > r: return (0, 0) if l <= node.left and node.right <= r: return (node.even_sum, node.odd_sum) self.push_down(node) left_even, left_odd = self._query_sum(node.left_child, l, r) right_even, right_odd = self._query_sum(node.right_child, l, r) return (left_even + right_even, left_odd + right_odd) def main(): import sys input = sys.stdin.read data = input().split() ptr = 0 N = int(data[ptr]) ptr +=1 M = int(data[ptr]) ptr +=1 C = int(data[ptr]) ptr +=1 A = list(map(int, data[ptr:ptr+N])) ptr +=N intervals = [] for _ in range(M): L = int(data[ptr])-1 ptr +=1 R = int(data[ptr])-1 ptr +=1 intervals.append( (L, R) ) st = SegmentTree(A) heap = [] for i in range(M): L, R = intervals[i] even, odd = st.query_sum(L, R) gain = even - odd - C heapq.heappush(heap, (-gain, i, L, R)) total = 0 processed = set() while heap: neg_gain, i, L, R = heapq.heappop(heap) gain = -neg_gain if gain <=0: continue current_even, current_odd = st.query_sum(L, R) current_gain = current_even - current_odd - C if current_gain != gain: if current_gain >0: heapq.heappush(heap, (-current_gain, i, L, R)) continue total += current_gain st.flip_range(L, R) heapq.heappush(heap, (-current_gain, i, L, R)) print(total) if __name__ == "__main__": main()