题解 | #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())
全部评论

相关推荐

给我发了笔试链接,想着等晚上回去做,结果还没做流程就终止了
伟大的小黄鸭在学习:我猜就是笔试几乎没用,就是用来给用人部门拖时间复筛简历的,可能用人部门筛到你简历觉得不合适就提前挂了
投递小鹏汽车等公司10个岗位
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-21 13:38
8月实习会变多吗现在还没找到实习该怎么办...回复的hr好少
码农索隆:3-4月就要开始找,基本上6月份就发offer,7月初已经开始暑期实习了。
点赞 评论 收藏
分享
评论
4
收藏
分享

创作者周榜

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