哈哈,就做出一题,最后一题F,还是最后一分钟做出来的
思路 - 滑动窗口
假设a,b = A[i],B[i]
- 若
b不存在于A,那a只能换取窗口中的-1- 有多少个
-1,就乘以多少种情况 - 若没有
-1,那就返回0
- 有多少个
- 若
b存在于A,那a只能换窗口中的A[j],且A[j] == b- 若存在
A[j],那交换的情况只有1种 - 若不存在
A[j],那就返回0
- 若存在
- 窗口滑动过程中维护两个值
-1的数目- 窗口中含有哪些不等于
-1的数
mod = 998244353
# 滑动窗口
for _ in range(int(input())):
n,w = map(int,input().strip().split())
A = list(map(int,input().strip().split()))
B = list(map(int,input().strip().split()))
def getRes():
tmp = set(A)
l,r = 0,0
# -1 数目
t = 0
flag = [False] * (n+1)
while r <= w:
if A[r] != -1:
flag[A[r]] = True
else:
t += 1
r += 1
res = 1
while l < n:
a,b = A[l],B[l]
if b in tmp:
# 范围内没有
if not flag[b]:
return 0
# 有,只能换,一种情况
res *= 1
flag[b] = False
# 只能换-1
elif not t:
return 0
else:
res *= t
t -= 1
l += 1
if r < n:
if A[r] == -1:
t += 1
else:
flag[A[r]] = True
r += 1
res %= mod
return res
print(getRes())



京公网安备 11010502036488号