#4533. 最少翻转操作数

    ID: 4533 传统题 1000ms 256MiB 尝试: 0 已通过: 0 难度: (无) 上传者: 标签>难度普及+/提高数据结构高级数据结构并查集基础算法BFS

最少翻转操作数

当前没有测试数据。

题目描述

给你一个整数 nn 和一个在范围 [0,n1][0, n - 1] 以内的整数 pp ,它们表示一个长度为 nn 且下标从 00 开始的数组 arrarr ,数组中除了下标为 pp 处是 11 以外,其他所有数都是 00

同时给你一个整数数组 bannedbanned ,它包含数组中的一些位置。bannedbanned 中第 ii 个位置表示 arr[banned[i]]=0arr[banned[i]] = 0 ,题目保证 banned[i]!=pbanned[i] != p

你可以对 arrarr 进行 若干次 操作。一次操作中,你选择大小为 kk 的一个 子数组 ,并将它 翻转 。在任何一次翻转操作后,你都需要确保 arrarr 中唯一的 11 不会到达任何 bannedbanned 中的位置。换句话说,arr[banned[i]]arr[banned[i]] 始终 保持 00

请你输出一个数组 ansans ,对于 [0,n1][0, n - 1] 之间的任意下标 iians[i]ans[i] 是将 11 放到位置 ii 处的 最少 翻转操作次数,如果无法放到位置 ii 处,此数为 1-1

子数组 指的是一个数组里一段连续 非空 的元素序列。 对于所有的 iians[i]ans[i] 相互之间独立计算。 将一个数组中的元素 翻转 指的是将数组中的值变成 相反顺序 。

输入格式

第一行,三个空格隔开的整数分别表示 nnppkk,语义同题目描述;

第二行第一个数为 bannedbanned 数组的长度 mm,接下来 空格隔开的 mm 个数,表示 bannedbanned 数组的元素。

输出格式

一行空格隔开的 nn 个数,表示 ansans 数组。

样例

样例 1:

4 0 4
2 1 2
0 -1 -1 1

解释:

k=4k = 4,所以只有一种可行的翻转操作,就是将整个数组翻转。一开始 11 在位置 00 处,所以将它翻转到位置 00 处需要的操作数为 00

我们不能将 11 翻转到 bannedbanned 中的位置,所以位置 1122 处的答案都是 1-1

通过一次翻转操作,可以将 11 放到位置 33 处,所以位置 33 的答案是 11

样例 2:

5 0 3
2 2 4
0 -1 -1 -1 -1

解释:

这个例子中 11 一开始在位置 00 处,所以此下标的答案为 00

翻转的子数组长度为 k=3k = 311 此时在位置 00 处,所以我们可以翻转子数组 [0,2][0, 2],但翻转后的下标 22bannedbanned 中,所以不能执行此操作。

由于 11 没法离开位置 00 ,所以其他位置的答案都是 1-1

样例 3:

4 2 1
3 0 1 3
-1 -1 0 -1

解释:

这个例子中,我们只能对长度为 1 的子数组执行翻转操作,所以 1 无法离开初始位置。

提示:

  • 1<=n<=1051 <= n <= 10^5
  • 0<=p<=n10 <= p <= n - 1
  • 0<=banned.length<=n10 <= banned.length <= n - 1
  • 0<=banned[i]<=n10 <= banned[i] <= n - 1
  • 1<=k<=n1 <= k <= n
  • banned[i]!=pbanned[i] != p
  • banned中的值互不相同banned 中的值 互不相同

来源

leetcode.cn 2612. 最少翻转操作数

}