在Python中查找数量严格递增的彩色蜡烛序列
假设有n个蜡烛从左到右排列。从左侧第i个蜡烛的高度为h[i],颜色为c[i]。我们还有一个整数k,表示颜色的范围在1到k之间。我们要找出有多少种严格递增的彩色蜡烛序列?递增序列是根据高度检查的,序列被称为彩色的,如果在1到K的颜色范围内至少有一支蜡烛可用。如果答案太大,则返回结果模10 ^ 9 + 7。
因此,如果输入如下:K= 3 ,h = [1,3,2,4],c = [1,2,2,3],则输出将为2,因为它有序列[1,2,4]和[1,3,4]。
要解决此问题,我们将遵循以下步骤 –
- 定义一个函数read()。这将采取T,i
- s:=0
- 当i > 0时,执行以下操作
- s:= s + T[i]
- s:= s mod 10 ^ 9 + 7
- i:= i – (i AND – i)
- 返回s
- 定义一个函数update()。这将采取T,i,v
- 当i <= 50010时,执行以下操作
- T[i]:= T[i] + v
- T[i]:= T[i] mod 10 ^ 9 + 7
- i:= i + (i AND – i)
- 返回v
- 从主方法中执行以下操作 –
- L:= 2 ^ k,R:= 0,N:= h的大小
- 对于范围0到L-1的i,执行以下操作
- T:=大小为50009的数组,并填充为0
- t:=0
- 对于范围0到N-1的j,执行以下操作
- 如果(将c[j] – 1次向右移位i)为奇数,则
- t:= t + update(T,h[j],read(T,h[j] – 1)+1)
- t:= t mod 10 ^ 9 + 7
- 如果i中的位数模2与k模2相同,则
- R:= R + t
- R:= R mod 10 ^ 9 + 7
- 否则,
- R:=(R + 10 ^ 9+7)- t
- R:= R mod 10 ^ 9 + 7
- 返回R
示例
看下面的实现以更好地理解 –
def solve(k, h, c):
def read(T, i):
s = 0
while i > 0:
s += T[i]
s %= 1000000007
i -= (i & -i)
return s
def update(T, i, v):
while i <= 50010:
T[i] += v
T[i] %= 1000000007
i += (i & -i)
return v
def number_of_bits(b):
c = 0
while b:
b &= b - 1
c += 1
return c
L = 2 ** k
R = 0
N = len(h)
for i in range(L):
T = [0 for _ in range(50010)]
t = 0
for j in range(N):
if (i >> (c[j] - 1)) & 1:
t += update(T, h[j], read(T, h[j] - 1) + 1)
t %= 1000000007
if number_of_bits(i) % 2 == k % 2:
R += t
R %= 1000000007
else:
R += 1000000007 - t
R %= 1000000007
return R
k = 3
h = [1,3,2,4]
c = [1,2,2,3]
print(solve(k, h, c))
输入
3, [1,3,2,4], [1,2,2,3]
输出
2