thảo luận Leetcode + Codeforces, Competitive programming contest. Đường tới Guardian + Candidate Master.

  • Người tạo chủ đề Người tạo chủ đề freedom.9
  • Ngày bắt đầu Ngày bắt đầu
Bài 4 build prefix sum rồi gọi recursion chia left, right thôi các anh.
Cơ mà bài 3 làm sao vậy các anh. Đề dễ hiểu mà nghĩ mãi không ra
=((
 
Bài 4 build prefix sum rồi gọi recursion chia left, right thôi các anh.
Cơ mà bài 3 làm sao vậy các anh. Đề dễ hiểu mà nghĩ mãi không ra
=((
Q3 thì có vài trường hợp
Trường hợp 0 ops thì sorted == ban đầu, -1 thì n == 2 mà sorted ko bằng ban đầu.
Trường hợp 1 ops thì chỉ cần min nằm ở vị trí 0 hoặc max ở vị trí cuối, lúc này chỉ cần chọn cái sub array còn lại để sort.
Trường hợp 2 ops thì cần 1 sort để đưa min về vị trí 0 hoặc max ở vị trí cuối. Xong dùng thêm 1 ops ở trường hợp 1 để correct.

Có tí edge case là thằng max nó nằm ở đầu và min ở cuối, vì ko thể dùng trường hợp 2 ops ở case này nên phải cần 1 ops để đưa max hoặc min vô giữa, sau mới dùng 2 ops nên tổng sẽ là 3 ops.
Còn nếu max nằm đầu và min ở cuối mà ở giữa có element max hoặc min thì có thể đưa thằng giữa về đầu hoặc cuối, quy về trường hợp dùng 2 ops.
 
Loại trừ cái dupplicated count đúng là thảm họa, loay hoay mãi, lâu ko làm quên mất cách đếm =((
Với mỗi index i nếu cân nhắc để tìm subarray chứ nó là good thì phải tìm left boundary và right boundary, nghĩa là với vị trí các bit 0 thì các elements bên trái ko được có bit 1. Tương tự đi với phía bên phải
Nhẩm nhẩm tính thì time complexity là 0(32*n)*log(n) nên chậm nhưng vẫn ăn
Python:
class Solution:
    def countGoodSubarrays(self, nums: list[int]) -> int:
        n = len(nums)
        
        def find(target):
            bitSet = [[] for _ in range(32)]
            dp = [0] * n
            for right in range(n):
                boundary = -1
                for i in range(32):
                    if (target[right] >> i) & 1 == 0:
                        last = bisect_left(bitSet[i], right)
                        if last != 0:
                            boundary = max(boundary, bitSet[i][last - 1])
                
                dp[right] = boundary
                for i in range(32):
                    if (target[right] >> i) & 1:
                        bitSet[i].append(right)
            return dp

        left = find(nums)
        rightRev = find(nums[::-1])

        prevOccurrenceMap = defaultdict(lambda: -1)
        leftOccurrenceBound = [-1] * n
        for i in range(n):
            val = nums[i]
            leftOccurrenceBound[i] = prevOccurrenceMap[val]
            prevOccurrenceMap[val] = i
        
        ans = 0
        for i in range(n):
            L = max(left[i], leftOccurrenceBound[i])
            revIdx = n - 1 - i
            revBoundary = rightRev[revIdx]
            R = n - 1 - revBoundary
            ans += (i - L) * (R - i)

        return ans©leetcode
 
Đêm qua cày film ngủ có mấy tiếng sáng nay lỏ quá, lại còn gặp quả bài 4 run time của Python như cức nữa chứ, TLE suốt phải convert qua C++ :ah:
1774712856849.webp
 
Nay mới ngồi virtual, tuần trước cái Q4 nó để < len(5000) phải làm bottom up mới pass.
Cứ làm topdown là MLE =(( cứ nghĩ nó TLE nhưng mà nó MLE
 
moá Q2 hôm nay là toán ạ :beated:
Q3 thì cứ nghĩ loop bình thường là ăn, sau phải có bin search vào mới AC :(
Q3 có cần bi search siếc gì đâu fen nhỉ, rank 665.
Q4 có vẻ khó quá

Python:
class Solution:
    def longestBalanced(self, s: str) -> int:
        def find(s):
            zeroCount = 0
            oneCount = 0
            n = len(s)
            dp = [[0, 0]]*n
            for i in range(n - 1, -1, -1):
                dp[i] = [zeroCount, oneCount]           
                if s[i] == '0':
                    zeroCount += 1
                else:
                    oneCount += 1

        
            seen = {0: -1}
            ans = 0
            diff = 0
            for i, char in enumerate(s):
                if char == '1':
                    diff += 1
                else:
                    diff -= 1

            
                if diff + 2 in seen and dp[i][1] > 0:
                    ans = max(ans, i - seen[diff + 2])

                if diff - 2 in seen and dp[i][0] > 0:
                    ans = max(ans, i - seen[diff - 2])
    
                if diff not in seen:
                    seen[diff] = i
                else:
                    ans = max(ans, i - seen[diff])

            return ans

        return max(find(s), find(s[::-1]))
 

Thống kê chủ đề

Ngày tạo
freedom.9,
Người trả lời cuối
deple20k,
Trả lời
1.686
Lượt xem
107.010
Quay lại
Lên đầu trang