Solution 1

Did not go through the solution yet!

Python · 2026-02-11
from collections import defaultdict, deque
from typing import List
class SegmentTree:
    '''
    Did not go through the solution yet!
    '''
    def __init__(self, n):
        self.n = n
        self.mn = [0] * (4 * n)
        self.lazy = [0] * (4 * n)

    def _push(self, i):
        if self.lazy[i]:
            for c in (i * 2, i * 2 + 1):
                self.mn[c] += self.lazy[i]
                self.lazy[c] += self.lazy[i]
            self.lazy[i] = 0

    def _add(self, i, l, r, ql, qr, v):
        if ql > r or qr < l:
            return
        if ql <= l and r <= qr:
            self.mn[i] += v
            self.lazy[i] += v
            return
        self._push(i)
        m = (l + r) // 2
        self._add(i * 2, l, m, ql, qr, v)
        self._add(i * 2 + 1, m + 1, r, ql, qr, v)
        self.mn[i] = min(self.mn[i * 2], self.mn[i * 2 + 1])

    def add(self, l, r, v):
        if l <= r:
            self._add(1, 0, self.n - 1, l, r, v)

    def _rightmost_zero(self, i, l, r, ql):
        if r < ql or self.mn[i] > 0:
            return -1
        if l == r:
            return l
        self._push(i)
        m = (l + r) // 2
        res = self._rightmost_zero(i * 2 + 1, m + 1, r, ql)
        if res != -1:
            return res
        return self._rightmost_zero(i * 2, l, m, ql)

    def rightmost_zero(self, l):
        return self._rightmost_zero(1, 0, self.n - 1, l)

class Solution:
    def longestBalanced(self, nums: List[int]) -> int:
        n = len(nums)
        pos = defaultdict(deque)
        for i, v in enumerate(nums):
            pos[v].append(i)

        seg = SegmentTree(n)

        def sign(x):
            return 1 if x % 2 else -1

        # Initial contributions
        for v, dq in pos.items():
            p = dq[0]
            seg.add(p, n - 1, sign(v))

        ans = 0

        for l in range(n):
            r = seg.rightmost_zero(l)
            if r != -1:
                ans = max(ans, r - l + 1)

            v = nums[l]
            s = sign(v)
            dq = pos[v]
            dq.popleft()
            nxt = dq[0] if dq else n

            # remove old contribution
            seg.add(l, nxt - 1, -s)

        return ans
Leet Code/python.py · L5203–5287