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
Ghê quá, Trận vừa rồi feed 30 điểm rank cho các huynh rồi :canny:
Lâu lâu có bữa đầu óc đơ đơ, giải q1 cũng lâu nữa

via theNEXTvoz for iPhone
cái leetcode predict nó không đúng lắm đâu bác, tuần trước em tưởng rank 2k lỏ, cuối cùng cheater bị trừ xuống 1k8 luôn
zFNuZTA.png
zFNuZTA.png
bút được thêm ít điểm
 
nay đề dễ thở hơn nhỉ,
Tiếc là chỉ rảnh được 30p nên đc có 2 bài :(
 
Dính bug bài 2 đọc k kỹ tưởng cần phải chia hết, bài cuối thì tính ngu prefix sum. AK vẫn 1k thì đề dễ quá :ah:
 
Q4 mà bình tĩnh hơn ko dùng binary search mà xử lí chỗ tìm left mà sửa cái increasing thông minh tí là ăn cmnr, óc heo thật =((
Python:
from math import inf

class Solution:
    def maxSumTrionic(self, nums: List[int]) -> int:
        n = len(nums)

        prefixSum = [0]*n
        s = 0
        for i,v in enumerate(nums):
            s += v
            prefixSum[i] = s

        def query(l,r):
            return prefixSum[r] - (prefixSum[l-1] if l>0 else 0)

        increasing = [-1]*n
        incRight = [-1]*n
        decRight = [-1]*n

        for i in range(1,n):
            if nums[i] > nums[i-1]:
                increasing[i] = increasing[i-1] if increasing[i-1] != -1 else i-1
                if i - increasing[i] == 2 and nums[increasing[i]] < 0:
                    increasing[i] += 1

        for i in range(n-2,-1,-1):
            if nums[i] > nums[i+1]:
                decRight[i] = decRight[i+1] if decRight[i+1] != -1 else i+1
            if nums[i] < nums[i+1]:
                incRight[i] = incRight[i+1] if incRight[i+1] != -1 else i+1

        ans = -inf
        for p in range(1,n-2):
            l = increasing[p]
            if l == -1: continue

            q = decRight[p]
            if q == -1: continue

            r = incRight[q]
            if r == -1: continue

            if query(q, q+1) > query(q, r):
                r = q+1

            ans = max(ans, query(l, r))

        return ans
Cứ đi fix cái binary search để tìm cái điểm left làm chó gì ko biết, GANG quá
 
Q4 mà bình tĩnh hơn ko dùng binary search mà xử lí chỗ tìm left mà sửa cái increasing thông minh tí là ăn cmnr, óc heo thật =((
Python:
from math import inf

class Solution:
    def maxSumTrionic(self, nums: List[int]) -> int:
        n = len(nums)

        prefixSum = [0]*n
        s = 0
        for i,v in enumerate(nums):
            s += v
            prefixSum[i] = s

        def query(l,r):
            return prefixSum[r] - (prefixSum[l-1] if l>0 else 0)

        increasing = [-1]*n
        incRight = [-1]*n
        decRight = [-1]*n

        for i in range(1,n):
            if nums[i] > nums[i-1]:
                increasing[i] = increasing[i-1] if increasing[i-1] != -1 else i-1
                if i - increasing[i] == 2 and nums[increasing[i]] < 0:
                    increasing[i] += 1

        for i in range(n-2,-1,-1):
            if nums[i] > nums[i+1]:
                decRight[i] = decRight[i+1] if decRight[i+1] != -1 else i+1
            if nums[i] < nums[i+1]:
                incRight[i] = incRight[i+1] if incRight[i+1] != -1 else i+1

        ans = -inf
        for p in range(1,n-2):
            l = increasing[p]
            if l == -1: continue

            q = decRight[p]
            if q == -1: continue

            r = incRight[q]
            if r == -1: continue

            if query(q, q+1) > query(q, r):
                r = q+1

            ans = max(ans, query(l, r))

        return ans
Cứ đi fix cái binary search để tìm cái điểm left làm chó gì ko biết, GANG quá
Q4 này thím nào làm Q1 càng lẹ thì ra càng nhanh thôi.
Về cơ bản là tìm mọi bộ, dài nhất có thể LPQR thỏa mãn bài toán (greedy), xong trong lúc tìm thì cập nhật maxSum tương ứng luôn (prefixSum)
 

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.103
Quay lại
Lên đầu trang