JakovichTimViec
Senior Member
H mới biết đang trong contest vẫn ăn ban đc
. Tưởng sau contest mới ban dần dần.Đang 2k9 nhảy lên 1k1
. Tưởng sau contest mới ban dần dần.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Ờ nhỉ, trong contest sao nghĩ phức tạp quá. Loop n thằng đầu tiên là ra cmnr
Vl mình đi làm merge interval các thứ
via theNEXTvoz for iPhone
nó update chậm thôi chứ chưa lọc đâu. tầm 10p trước chư vào xem mới ghi nhận 307 AKXem tệp đính kèm 3303377
H mới biết đang trong contest vẫn ăn ban đc. Tưởng sau contest mới ban dần dần.
Đang 2k9 nhảy lên 1k1
k9 là vozliz rồi thì trình độ tất nhiên là bằng Vozliz chứ trưk9 mới leo lại nên k

3 q đầu làm 20 phút củm oke, xài tí toán học greedy. q4 dp ko biết giải![]()
Mấy bác đỉnh quá, 3q đầu em toàn 40p với dạng giải rtại mấy bác bảo dễ, nên mình biết là câu 5point chắc chắn là tricky chứ làm live thì ko nhanh v đâu, overthinking phát là ngắm cả tiếng ngayMấy bác đỉnh quá, 3q đầu em toàn 40p.


2Q gang, TLE 2Q còn lại

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
Sai 1 lần bị tính thêm 5 phút vào thời gian hoàn thành. Khi xếp hạng thì sẽ xếp theo số điểm nhiều nhất trước, nếu bằng điểm xếp theo tổng thời gian nhanh nhất => Sai nhiều thì hạng sẽ thấp hơnNay em mới chơi cái này lần đầu, submit sai nhiều có bị sao không mấy bác![]()
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
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ềuBà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
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

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