classSolution:defmaxEnvelopes(self, envelopes: List[List[int]])->int:
n =len(envelopes)
envelopes.sort(key=lambda x:(x[0],-x[1]))deflis(nums):
LIS =[1]* n
for i inrange(n -1,-1,-1):for j inrange(i +1, n):if nums[i]< nums[j]:
LIS[i]=max(LIS[i],1+ LIS[j])returnmax(LIS)return lis([e[1]for e in envelopes])
classSegmentTree:def__init__(self, N):
self.n = N
while(self.n &(self.n -1))!=0:
self.n +=1
self.tree =[0]*(2* self.n)defupdate(self, i, val):
self.tree[self.n + i]= val
j =(self.n + i)>>1while j >=1:
self.tree[j]=max(self.tree[j <<1], self.tree[j <<1|1])
j >>=1defquery(self, l, r):if l > r:return0
res =float('-inf')
l += self.n
r += self.n +1while l < r:if l &1:
res =max(res, self.tree[l])
l +=1if r &1:
r -=1
res =max(res, self.tree[r])
l >>=1
r >>=1return res
classSolution:defmaxEnvelopes(self, envelopes: List[List[int]])->int:
n =len(envelopes)
envelopes.sort(key=lambda x:(x[0],-x[1]))deflis(nums):defcompress(arr):
sortedArr =sorted(set(arr))
order =[]for num in arr:
order.append(bisect_left(sortedArr, num))return order
nums = compress(nums)
n =len(nums)
segTree = SegmentTree(n)
LIS =0for num in nums:
curLIS = segTree.query(0, num -1)+1
segTree.update(num, curLIS)
LIS =max(LIS, curLIS)return LIS
return lis([e[1]for e in envelopes])