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

Q4 cũng giống bài này nha ae :ah: dùng đc segment tree, mới tuần trước làm virtual thấy
 
Q4 cũng giống bài này nha ae :ah: dùng đc segment tree, mới tuần trước làm virtual thấy
bài Q4 này chính ra tier medium-hard thôi bác nhỉ, chắc rating bài này cỡ 1k9 :surrender:
 
cay bài 2 thật, chủ quan dùng hàm count dính mịa 1 thẹo :sweat: bài 3 thì dùng > thay vì >=, thêm 1 thẹo nữa
Screenshot 2025-11-08 at 08.41.13.png
 
Q4 cũng giống bài này nha ae :ah: dùng đc segment tree, mới tuần trước làm virtual thấy
Đưa về prefix sum xong tìm các tổng > 0 là dc. Dùng bất cứ gì có thể range query trong n log n là ăn roài
 
Python:
class Solution:
    def countMajoritySubarrays(self, nums: List[int], target: int) -> int:
        answer = 0

        current_diff = 0
        diff_freq = {0: 1}
        count_start_pos = 0

        for num in nums:
            if num == target:
                count_start_pos += diff_freq.get(current_diff,0)
                current_diff += 1
            else:
                current_diff -= 1
                count_start_pos -= diff_freq.get(current_diff,0)

            answer += count_start_pos
            diff_freq[current_diff] = diff_freq.get(current_diff,0) + 1

        return answer
 
Python:
class Solution:
    def countMajoritySubarrays(self, nums: List[int], target: int) -> int:
        answer = 0

        current_diff = 0
        diff_freq = {0: 1}
        count_start_pos = 0

        for num in nums:
            if num == target:
                count_start_pos += diff_freq.get(current_diff,0)
                current_diff += 1
            else:
                current_diff -= 1
                count_start_pos -= diff_freq.get(current_diff,0)

            answer += count_start_pos
            diff_freq[current_diff] = diff_freq.get(current_diff,0) + 1

        return answer
đoạn count_start_pos ý tưởng là sao vậy thím :beauty: :beauty:
 
Python:
class Solution:
    def countMajoritySubarrays(self, nums: List[int], target: int) -> int:
        res = 0
        n = len(nums)
        prefix = [0]*(n+1)
        for i in range(n):
            num = nums[i]
            if num == target:
                prefix[i+1]=prefix[i]+1
            else:
                prefix[i+1]=prefix[i]-1
        s = SortedList()
        res = 0
        for num in prefix:
            l = s.bisect_left(num)
            res+= l
            s.add(num)
        return res
 
Bài 3 thì ý tưởng hình như quen quá rồi nhỉ, cứ giải giống bài product of numbers in array except self là được :sweet_kiss:
 
Python:
class Solution:
    def countMajoritySubarrays(self, nums: List[int], target: int) -> int:
        res = 0
        n = len(nums)
        prefix = [0]*(n+1)
        for i in range(n):
            num = nums[i]
            if num == target:
                prefix[i+1]=prefix[i]+1
            else:
                prefix[i+1]=prefix[i]-1
        s = SortedList()
        res = 0
        for num in prefix:
            l = s.bisect_left(num)
            res+= l
            s.add(num)
        return res
Fen đưa đoạn tính prefix sum rồi add vô sl vô 1 loop là được, dùng 1 biến count là đủ rồi
 
đoạn count_start_pos ý tưởng là sao vậy thím :beauty: :beauty:
count_start_pos là số vị trí để mảng con bắt đầu tại đó, kết thúc ở num có target chiếm đa số (là những vị trí mà diff < current_diff).
Ý tưởng là ở mỗi bước current_diff (hiệu số giữa số giá trị bằng target và số giá trị không bằng target) chỉ lên xuống 1 đơn vị => Tận dụng count_start_pos ở vị trí trước đó rồi cộng trừ vào, không phải đếm lại từ đầu
 
Sửa lần cuối:
Fen đưa đoạn tính prefix sum rồi add vô sl vô 1 loop là được, dùng 1 biến count là đủ rồi
Python:
class Solution:
    def countMajoritySubarrays(self, nums: List[int], target: int) -> int:
        res, count = 0, 0
        n = len(nums)
        s = SortedList()
        for i in range(n+1):
            res += s.bisect_left(count)
            s.add(count)
            if i < n:
                count = count+1 if nums[i]==target else count-1
        return res

Như này đúng k bác :beauty:
 
count_start_pos là số vị trí để mảng con bắt đầu tại đó, kết thúc ở num có target chiếm đa số (là những vị trí mà diff < current_diff).
Ý tưởng là ở mỗi bước current_diff (hiệu số giữa số giá trị bằng target và số giá trị không bằng target) chỉ lên xuống 1 đơn vị => Tận dụng count_start_pos ở vị trí trước đó rồi cộng trừ vào, không phải đếm lại từ đầu
ầu... rất giống bài mod hôm nọ :extreme_sexy_girl:
 
đệch SortedList trong Python nó cho lấy vị trí á bác :v ctdl thông thường làm gì vừa query + insert + lấy vị trí trong O(log) được đâu :((
 

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