cp-library

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub kobejean/cp-library

:heavy_check_mark: cp_library/alg/dp/lis_fn.py

Depends on

Verified with

Code

import cp_library.__header__
from bisect import bisect_left
import cp_library.alg.__header__
import cp_library.alg.dp.__header__
from cp_library.alg.dp.max2_fn import max2
from cp_library.alg.dp.chmin_fn import chmin

def lis(A: list):
    N = len(A)
    mn, mx = min(A), max(A)
    dp, idx, prev = [mx+1]*(N+1), [-1]*(N+1), [-1]*N
    dp[0], r = mn-1, 0
    for i,a in enumerate(A):
        if chmin(dp, p := bisect_left(dp,a,hi=r+1), a):
            idx[p], prev[i], r = i, idx[p-1], max2(r,p)
    ans, i = [0]*r, idx[r]
    for j in range(r-1,-1,-1): ans[j], i = i, prev[i]
    return ans

    
'''
╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸
             https://kobejean.github.io/cp-library               
'''
from bisect import bisect_left



def max2(a, b):
    return a if a > b else b

def chmin(dp, i, v):
    if ch:=dp[i]>v:dp[i]=v
    return ch

def lis(A: list):
    N = len(A)
    mn, mx = min(A), max(A)
    dp, idx, prev = [mx+1]*(N+1), [-1]*(N+1), [-1]*N
    dp[0], r = mn-1, 0
    for i,a in enumerate(A):
        if chmin(dp, p := bisect_left(dp,a,hi=r+1), a):
            idx[p], prev[i], r = i, idx[p-1], max2(r,p)
    ans, i = [0]*r, idx[r]
    for j in range(r-1,-1,-1): ans[j], i = i, prev[i]
    return ans

    
Back to top page