蓝桥杯 2026 省 B 理想温度 题解
· 4 min read ·
—
P16238 [蓝桥杯 2026 省 B] 理想温度 - 洛谷
思路
首先,对于每个位置 ,我们定义差值 ,接下来有两种情况:
- 若 ,说明开始时已满足要求。
- 若 ,则需要加上 才能使其满足要求。
这时,我们可以选定增加的数值 (),则对任意位置 :
- 若 ,即原本不满足要求,操作后满足要求则答案需要增加 1。
- 若 ,即原本满足要求,操作后变为 不满足要求,答案需要减 1。
- 若 为其他值,原本不满足要求,操作后仍不满足要求,答案不变。
所以,我们可以这样思考,对于每一种非零差值 ,建立一个价值数组 ,则满足以下情况:
- 当且仅当 时;
- 当且仅当 时;
- 当且仅当 为其他值时。
然后在 上求最大子段和,为方便记忆,我们将其记做该 的最大净收益 ,然后,我们将所有 的最大值记为 。最终答案即是 初始匹配数 与 的和。
如果每次都做一次最大子段和显然会超时,关键在于:不是对每个 k 都遍历整个数组,而是只遍历 的那些位置。具体见代码
代码
import sys
input = lambda: sys.stdin.readline().rstrip()
from bisect import bisect_left, bisect_right
from heapq import heappop, heappush, heapify
from collections import Counter, deque, defaultdict
from math import inf, ceil, gcd, sqrt, factorial, log2, log
from itertools import combinations, permutations
def solve():
n = int(input())
a = [0] + list(map(int, input().split()))
b = [0] + list(map(int, input().split()))
f = [0] * (n + 1)
d = defaultdict(list)
for i in range(1, n + 1):
f[i] = f[i - 1] + (a[i] == b[i])
if (a[i] == b[i]):
continue
d[b[i] - a[i]].append(i)
ans = 0
for ls in d.values():
cur = 0
for i in range(len(ls)):
if (i):
cur = max(1, cur + 1 - f[ls[i] - 1] + f[ls[i - 1]])
else:
cur = 1
ans = max(ans, cur)
print(ans + f[n])
T = 1
# T = int(input())
for _ in range(T):
solve()