题解 | #合唱队#
合唱队
https://www.nowcoder.com/practice/6d9d69e3898f45169a441632b325c7b4
N = int(input())
a = list(map(int, input().split()))
ans = 0
lf = [1] * (N)
rf = [1] * (N)
# for i in range(1, N):
# for j in range(i):
# if a[j] < a[i]:
# lf[i] = max(lf[i], lf[j]+1)
# for i in range(N-2, -1, -1):
# for j in range(N-1, i, -1):
# if a[j] < a[i]:
# rf[i] = max(rf[i], rf[j]+1)
# TLE
import bisect
lf = [1000000 for _ in range(N)] # 维护最有递增潜力子列
rf = [1000000 for _ in range(N)]
lcnt = [1] # lcnt[i] = n : 第i个人作为中间时, 它左边最多能站几个人构成递增子列
rcnt = [1]
lf[0] = a[0]
for i in range(1, N):
idx = bisect.bisect_right(lf, a[i]) # 这个是<= 需要手动去除=
if idx > 0 and lf[idx-1] == a[i]:
lcnt.append(idx) # 两个人身高一样, 则它们左边站的人数也一样
else:
lf[idx] = a[i]
lcnt.append(idx+1)
rf[0] = a[-1]
for i in range(N-2, -1, -1):
idx = bisect.bisect_right(rf, a[i])
if idx > 0 and rf[idx-1] == a[i]:
rcnt.append(idx)
else:
rf[idx] = a[i]
rcnt.append(idx+1)
rcnt.reverse()
for l, r in zip(lcnt, rcnt):
ans = max(ans, l+r)
print(N-ans+1)
# ps: 会有人身高超过十米?

