哈哈,就做出一题,最后一题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())