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