โ 12015 ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด 2 โ
import sys
input=sys.stdin.readline
N=int(input())
A=list(map(int,input().split()))
#binary search
def binary_search(l, x):
start,end=0,len(l)-1
while start<=end:
mid=(start+end)//2
if x <= l[mid]:
end=mid-1
ans=mid
else:
start=mid+1
l[ans]=x
return l
#LIS
ans=[A[0]]
for x in range(1,N):
if ans[-1] < A[x]: #just add
ans.append(A[x])
else: #searching the spot
ans=binary_search(ans, A[x])
print(len(ans))
๐ LIS(O(nlogn)) ๋ฌธ์
โ 12738 ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด 3 โ
๐ ์์ด ์์๊ฐ ์์์ฌ๋ LIS(O(nlogn)) ์๊ณ ๋ฆฌ์ฆ์ ์ฑ๋ฆฝ
โ 1365 ๊ผฌ์ธ ์ ๊น์ค โ
import sys
input=sys.stdin.readline
N=int(input())
n=list(map(int,input().split()))
def binary_search(l,x):
start,end=0,len(l)-1
while start<=end:
mid=(start+end)//2
if x <= l[mid]:
ans = mid
end = mid - 1
else:
start = mid + 1
l[ans] = x
return l
#lis(o(nlogn))
ans=[n[0]]
for x in range(1,N):
if ans[-1] < n[x]:
ans.append(n[x])
else:
ans=binary_search(ans,n[x])
print(N-len(ans))
๐ ๊ผฌ์ด์ง ์๊ฒ lis(O(nlogn)) ์๊ณ ๋ฆฌ์ฆ ์ ์ฉ
โ 2352 ๋ฐ๋์ฒด ์ค๊ณ โ
import sys
input=sys.stdin.readline
n=int(input())
l = list(map(int,input().split()))
def binary_search_lis(arr,n):
start,end=0,len(arr)-1
while start<=end:
mid=(start+end)//2
if n <= arr[mid]:
ans = mid
end = mid-1
else:
start = mid+1
arr[ans] = n
return arr
arr=[l[0]]
for x in range(1,n):
if arr[-1]<l[x]:
arr.append(l[x])
else:
arr = binary_search_lis(arr,l[x])
print(len(arr))
๐ ์ 1365 ๊ผฌ์ธ ์ ๊น์ค๊ณผ ๋์ผํ ๋ฌธ์ . ์ด๋ถํ์์ ํ์ฉํ O(nlogn) LIS ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ฐ๊ฒฐ ๊ฐ๋ฅ ํฌํธ ์ต๋ ๊ฐ์ ๊ตฌํ๊ธฐ
โ 3066 ๋ธ๋ฆฌ์ง ์๊ทธ๋ โ
import sys
input=sys.stdin.readline
def binary_search_lis(arr,n):
start,end=0,len(arr)-1
while start<=end:
mid=(start+end)//2
if n <= arr[mid]:
ans = mid
end = mid-1
else:
start = mid+1
arr[ans] = n
return arr
for _ in range(int(input())):
N=int(input())
l = [int(input()) for _ in range(N)]
arr=[l[0]]
for x in range(1,N):
if arr[-1]<l[x]:
arr.append(l[x])
else:
arr = binary_search_lis(arr,l[x])
print(len(arr))
๐ ์ญ์ LIS(O(nlogn))์ผ๋ก ์ ๋ฌธ์ ์ ๋์ผ
โ 1818 ์ฑ ์ ๋ฆฌ โ
import sys
input=sys.stdin.readline
def binary_search_lis(arr,n):
start,end=0,len(arr)-1
while start<=end:
mid=(start+end)//2
if n < arr[mid]:
ans = mid
end = mid-1
else:
start = mid+1
arr[ans] = n
return arr
N=int(input())
l=list(map(int,input().split()))
arr=[l[0]]
for x in range(1,N):
if arr[-1]<l[x]:
arr.append(l[x])
else:
arr = binary_search_lis(arr,l[x])
print(N-len(arr))
๐ 1๋ถํฐ N๊น์ง ์ฑ ์ ๊ฐ์ง๋ฐํ๊ฒ ์ ๋ฆฌํ๊ธฐ ์ํด์๋, ๊ฐ์ง๋ฐํ๊ฒ ์ ๋ฆฌํ, ์ฆ ์ฑ ๋ฒํธ๊ฐ ์ฆ๊ฐํ๋ ๊ฐ์ฅ ๊ธด ๋ถ๋ถ ์์ด LIS์ ๊ธธ์ด๋ฅผ ๊ตฌํ๊ณ (์ด ๋ ์ฑ ์ด ๋์๋์ ์์ด๋ ์๊ด ์๋ค), ์ ์ฒด ์ฑ ์ ์์์ LIS์ ๊ธธ์ด๋ฅผ ๋บ ๊ฐ์๋งํผ ๋ณธ๋ ์๋ฆฌ์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค. LIS๋ผ๋ ์์ด๋์ด๋ฅผ ์ฌ์ฉํด์ผ ํจ์ ๊ธฐ์ตํด์ผ ํ๋ ์ ํ. LIS ์์ฉ๋ฒ์
โ 3745 ์ค๋ฆ์ธ โ
import sys
input=sys.stdin.readline
def binary_search_lis(arr,n):
start,end=0,len(arr)-1
while start<=end:
mid=(start+end)//2
if n <= arr[mid]:
ans = mid
end = mid-1
else:
start = mid+1
arr[ans] = n
return arr
while 1:
try:
N=int(input())
l=list(map(int,input().split()))
arr=[l[0]]
for x in range(1,N):
if arr[-1]<l[x]:
arr.append(l[x])
else:
arr = binary_search_lis(arr,l[x])
print(len(arr))
except:
break
๐ LIS(Onlogn) ๋ฌธ์
โ 12014 ์ฃผ์ โ
import sys
input=sys.stdin.readline
def binary_search_lis(ar,n):
start,end=0,len(ar)-1
while start<=end:
mid=(start+end)//2
if n <= ar[mid]:
ans = mid
end = mid-1
else:
start = mid+1
ar[ans] = n
return ar
T=int(input())
for i in range(T):
N,K=map(int,input().split())
l=list(map(int,input().split()))
arr=[l[0]]
for x in range(1,N):
if arr[-1]<l[x]:
arr.append(l[x])
else:
arr = binary_search_lis(arr,l[x])
if len(arr)>=K:
print(f'Case #{i+1}')
print(1)
else:
print(f'Case #{i+1}')
print(0)
๐ LIS(Onlogn) ๋ฌธ์
'BOJ > ๐ฅ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
โ Backtracking Upper-Advanced I - 1 Solvedโ (0) | 2024.01.24 |
---|---|
โ Backtracking Advanced I - 3 Solvedโ (1) | 2024.01.21 |
โ Binary Search Advanced I - 2 Solvedโ (0) | 2023.12.29 |
โ Coordinate Compression Advanced - 2 Solvedโ (0) | 2023.12.28 |
โ Tree Advanced I - 1 Solvedโ (1) | 2023.12.22 |
๋๊ธ