题解 | #tb的排列问题#

tb的排列问题

https://ac.nowcoder.com/acm/contest/90072/F

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

相关推荐

06-11 17:39
门头沟学院 Java
小呆呆的大鼻涕:卧槽,用户彻底怒了
点赞 评论 收藏
分享
评论
4
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务