This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
def bisect(arr, v, asc):
lo = 0
hi = len(arr)
while lo < hi:
mid = lo + (hi - lo) // 2
if asc:
if v <= arr[mid]:
hi = mid
else:
lo = mid + 1
else:
if v >= arr[mid]:
hi = mid
else:
lo = mid + 1
return lo
def find_lis(inp):
lis_ending = [0] * len(inp)
lis_ending_arr = []
lis_starting = [0] * len(inp)
lis_starting_arr = []
for i in range(len(inp)):
# LIS ending at i
idx = bisect(lis_ending_arr, inp[i], True)
if idx == len(lis_ending_arr):
lis_ending_arr.append(inp[i])
else:
lis_ending_arr[idx] = inp[i]
lis_ending[i] = len(lis_ending_arr)
# LIS starting at i
j = len(inp) - 1 - i
idx = bisect(lis_starting_arr, inp[j], False)
if idx == len(lis_starting_arr):
lis_starting_arr.append(inp[j])
else:
lis_starting_arr[idx] = inp[j]
lis_starting[j] = len(lis_starting_arr)
return lis_ending, lis_starting
def beacon(inp):
lis_ending, lis_starting = find_lis(inp)
res = 0
for i in range(len(inp) - 1):
val = lis_ending[i] + lis_starting[i + 1]
res = max(res, val)
res = max(res, lis_ending[len(inp) - 1])
return res
n,x = map(int, input().split())
inp = [int(x) for x in input().split()]
print(beacon(inp))
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |