2024.6.11刷题记录

目录

一、795. 前缀和 - AcWing题库

二、796. 子矩阵的和 - AcWing题库

三、797. 差分 - AcWing题库

四、798. 差分矩阵 - AcWing题库

五、799. 最长连续不重复子序列 - AcWing题库

六、800. 数组元素的目标和 - AcWing题库

七、2816. 判断子序列 - AcWing题库


一、795. 前缀和 - AcWing题库

n, m = map(int, input().split())
nums = [0] + list(map(int, input().split()))    # 在前面加一个元素,防止询问时越界
# 前缀和
for i in range(1, n + 1):
    nums[i] += nums[i - 1]
# 询问
for _ in range(m):
    l, r = map(int, input().split())
    print(nums[r] - nums[l - 1])

二、796. 子矩阵的和 - AcWing题库

n, m, q = map(int, input().split())
mat = []
# 存入矩阵
for _ in range(n):
    mat.append(list(map(int, input().split())))
# 前缀和
add = [[0] * (m + 1) for _ in range(n + 1)]
for i in range(n):
    for j in range(m):
        add[i + 1][j + 1] = add[i][j + 1] + add[i + 1][j] - add[i][j] + mat[i][j]
# 询问
for _ in range(q):
    x1, y1, x2, y2 = map(int, input().split())
    print(add[x2][y2] - add[x1 - 1][y2] - add[x2][y1 - 1] + add[x1 - 1][y1 - 1])

三、797. 差分 - AcWing题库

n, m = map(int, input().split())
nums = list(map(int, input().split()))
# 操作
diff = [0] * (n + 1)    # 差分数组
for _ in range(m):
    l, r, c = map(int, input().split())
    diff[l - 1] += c
    diff[r] -= c
# 前缀和
print(diff[0] + nums[0], end = ' ')
for i in range(1, n):
    diff[i] += diff[i - 1]
    print(diff[i] + nums[i], end = ' ')

四、798. 差分矩阵 - AcWing题库

n, m, q = map(int, input().split())
# 输入
mat = []
for _ in range(n):
    mat.append(list(map(int, input().split())))
# 操作
diff = [[0] * (m + 2) for _ in range(n + 2)]
for _ in range(q):
    x1, y1, x2, y2, c = map(int, input().split())
    diff[x1][y1] += c
    diff[x1][y2 + 1] -= c
    diff[x2 + 1][y1] -= c
    diff[x2 + 1][y2 + 1] += c
# 前缀和
for i in range(1, n + 1):
    for j in range(1, m + 1):
        diff[i][j] += diff[i - 1][j] + diff[i][j - 1] - diff[i - 1][j - 1]
        print(diff[i][j] + mat[i - 1][j - 1], end = ' ')
    print()

五、799. 最长连续不重复子序列 - AcWing题库

# 滑动窗口
import collections
n = int(input())
nums = list(map(int, input().split()))
# hash = collections.defaultdict(int)     # 储存区间中元素个数
hash = dict.fromkeys(nums, 0)
left, ans = 0, 0
for right in range(n):
    # 遍历右端点
    hash[nums[right]] += 1
    # 缩短区间,将左端点以到区间内无重复数字
    while hash[nums[right]] > 1:
        hash[nums[left]] -= 1
        left += 1
    ans = max(ans, right - left + 1)    # 更新答案
print(ans)

六、800. 数组元素的目标和 - AcWing题库

# 双指针
n, m, target = map(int, input().split())
alist = list(map(int, input().split()))
blist = list(map(int, input().split()))
i, j = 0, m - 1
while i < n and j >= 0:
    x, y = alist[i], blist[j]
    if x + y == target:
        print(i, j)
        break
    elif x + y > target:
        j -= 1
    else:
        i += 1

七、2816. 判断子序列 - AcWing题库

# 模拟
n, m = map(int, input().split())
short_list = list(map(int, input().split()))
long_list = list(map(int, input().split()))
i, j = 0, 0
while i < n and j < m:
    if short_list[i] == long_list[j]:
        i += 1
        j += 1
    else:
        j += 1
print('Yes' if i == n else 'No')

感谢你看到这里!一起加油吧!

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值