結果
| 問題 |
No.2321 Continuous Flip
|
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 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()
lam6er