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
1761405714086.png

H mới biết đang trong contest vẫn ăn ban đc :waaaht: . Tưởng sau contest mới ban dần dần.
Đang 2k9 nhảy lên 1k1
 
Ờ nhỉ, trong contest sao nghĩ phức tạp quá. Loop n thằng đầu tiên là ra cmnr :waaaht:
Vl mình đi làm merge interval các thứ
via theNEXTvoz for iPhone
loop n thằng, check dis thằng hiện tại (2 mảng) với thằng cuối và xem thằng cuối có bị bánh mỳ kẹp thịt phát nào không là đủ r, nói chung nhảm, 2 bài brute force cmnr
 
:v đọc không kĩ đề Q3, độ dài hơn nhau 1 mà cứ nghĩ là độ dài khác nhau :v ngồi giải ngáo ngơ luôn
4gmOAMB.png
4gmOAMB.png
4gmOAMB.png
 
Hôm nay thấy mệt mệt có điềm dùng clone thi, đọc đề bài 3 cứ tưởng là strictly smaller mất cả tiếng ko làm ra, nhìn lại thì thấy là strictly cay vl :ah:
 
Má ngồi làm rolling hash mãi éo ra. Cuối cùng bisect thì ăn luôn. Lại feed r. Thôi tối làm cf. 2k5 chắc peak của mình r. Lên 3k xem chừng hard :ah:
 
Bài 4 em có cách này hay hay share cho các bác, tại em làm bài subarray equals k hồi mấy tuần trước nên nảy ra ý làm bài này luôn :ah:

Python:
from math import gcd
class Solution:
    def numGoodSubarrays(self, nums: List[int], k: int) -> int:
        d = {0:1}
        cur = 0
        res = 0
        for num in nums:
            cur += num
            cur %=k
            res += d.get(cur, 0)
            d[cur] = d.get(cur, 0) + 1
        ctr = Counter(nums)
        
        for num, freq in ctr.items():
            required = k//gcd(num,k) # number of required nums to be divisible by k
            d = freq // required
            res -= (d*freq - required*d*(d+1)//2)
        return res
 
Bài 4 khá dễ ấy chứ ko khó nhỉ, ko choke Q3 là ăn rồi. Làm xong Q3 hết bà contest. Trick để loại bỏ phần bị dup là tính overCount của các phần tử liên tiếp vì nếu như việc dup nó nằm ở 2 số khác nhau như 111111112 thì nếu sub array end ở 2 thì sẽ ko bao giờ bị đếm trùng.
Thôi nói chung là xài clone nên ko quan trọng lắm, rút kinh nghiệm đọc đề kĩ hơn
Python:
class Solution:
    def numGoodSubarrays(self, nums: List[int], k: int) -> int:
        def countDupplicated(num, tot):
            l = lcm(num, k)
            curr = 1
            overCount = 0
            while l*curr <= num*tot:
                overCount += tot - (l*curr)//num
                curr += 1

            return overCount
        
        
        seen = defaultdict(int)
        seen[0] = 1
        prefixSum = 0
        ans = 0
        for num in nums:
            prefixSum += num
            if prefixSum % k in seen:
                ans += seen[prefixSum%k]
            
            seen[prefixSum%k] += 1

        count = 1
        for i in range(1, len(nums)):
            if nums[i] == nums[i - 1]:
                count += 1
            else:
                ans -= countMultipler(nums[i - 1], count)
                count = 1

        ans -= countDupplicated(nums[-1], count)
        return ans
 
Sửa lần cuối:
Bài 4 em có cách này hay hay share cho các bác, tại em làm bài subarray equals k hồi mấy tuần trước nên nảy ra ý làm bài này luôn :ah:

Python:
from math import gcd
class Solution:
    def numGoodSubarrays(self, nums: List[int], k: int) -> int:
        d = {0:1}
        cur = 0
        res = 0
        for num in nums:
            cur += num
            cur %=k
            res += d.get(cur, 0)
            d[cur] = d.get(cur, 0) + 1
        ctr = Counter(nums)
     
        for num, freq in ctr.items():
            required = k//gcd(num,k) # number of required nums to be divisible by k
            d = freq // required
            res -= (d*freq - required*d*(d+1)//2)
        return res
Cách viết cú pháp của bạn hay đó, ý tưởng của t cũng gần giống vậy mà gõ dài hơn nhiều :D
Mã:
class Solution:
    def numGoodSubarrays(self, nums: List[int], k: int) -> int:
        # number of good subarrays, including duplicate arrays
        total_arrays = 0

        prefix_sum = 0
        frequencies_of_prefix_sum = {0: 1} # before the first number

        for num in nums:
            prefix_sum = (prefix_sum + num) % k
            if prefix_sum in frequencies_of_prefix_sum:
                frequencies_of_prefix_sum[prefix_sum] += 1
            else:
                frequencies_of_prefix_sum[prefix_sum] = 1

        for f in frequencies_of_prefix_sum.values():
            total_arrays += f * (f - 1) // 2

        # number of duplicate subarrays
        duplicate_arrays = 0
        frequencies_of_numbers = {}

        for num in nums:
            if num in frequencies_of_numbers:
                frequencies_of_numbers[num] += 1
            else:
                frequencies_of_numbers[num] = 1

        for num in frequencies_of_numbers:
            occurrences = frequencies_of_numbers[num]

            for length in range (1, occurrences):
                if (num * length) % k != 0:
                    continue
                duplicate_arrays += occurrences - length

        return total_arrays - duplicate_arrays
 

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