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

ví dụ nè bác cop nguyên đề bài cho ai giải thì cái dòng velqurimex ..... là có 1 dòng text ẩn trong đề, máy đọc ký tự mới thấy.
ko xóa đi lúc leetcode quét là nó ban, chứ nó cũng chả phát hiện code do người hay ai viết đâu
1779602627077.webp
 
Cái bài 4 dùng cái square root decomposition hay quá, để code lại thử :byebye:
Python:
class SqrtDecomposition:
    def __init__(self, arr):
        n = len(arr)
        self.arr = arr
        self.blockSize = int(math.sqrt(n)) + 1
        self.numBlocks = math.ceil(n/self.blockSize)
       
        self.block = [[] for _ in range(self.numBlocks)]
        self.counter = [defaultdict(int) for _ in range(self.numBlocks)]
        self.lazy = [0] * self.numBlocks
       
        for i, val in enumerate(arr):
            b_idx = i // self.blockSize
            self.block[b_idx].append(val)
            self.counter[b_idx][val] += 1
   
    def addRange(self, left, right, val):
        l = left // self.blockSize
        r = right // self.blockSize
       
        if l == r:
            leftStart = left % self.blockSize
            rightEnd = right % self.blockSize
           
            for i in range(leftStart, rightEnd + 1):
                old_val = self.block[l][i]
                self.counter[l][old_val] -= 1
                self.block[l][i] += val
                self.counter[l][old_val + val] += 1
        else:
            # Left partial block
            leftStart = left % self.blockSize
            for i in range(leftStart, len(self.block[l])):
                old_val = self.block[l][i]
                self.counter[l][old_val] -= 1
                self.block[l][i] += val
                self.counter[l][old_val + val] += 1

            # Middle full blocks
            for i in range(l + 1, r):
                self.lazy[i] += val

            # Right partial block
            rightEnd = right % self.blockSize
            for i in range(0, rightEnd + 1):
                old_val = self.block[r][i]
                self.counter[r][old_val] -= 1
                self.block[r][i] += val
                self.counter[r][old_val + val] += 1

    def count(self, num):
        ans = 0
        for i in range(self.numBlocks):
            target = num - self.lazy[i]
            ans += self.counter[i][target]

        return ans

class Solution:
    def numberOfPairs(self, nums1: List[int], nums2: List[int], queries: List[List[int]]) -> List[int]:
        counter1 = Counter(nums1)
        tot = []
        seg = SqrtDecomposition(nums2)
       
        for q in queries:
            if q[0] == 2:
                t = q[1]
                ans = 0
               
                for num, freq in counter1.items():
                    ans += freq * seg.count(t - num)

                tot.append(ans)
            else:
                x, y, val = q[1], q[2], q[3]
                seg.addRange(x, y, val)
               
        return tot
Đã học được skill mới :doubt: ảo thật
 
Sửa lần cuối:

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