結果
問題 | No.1804 Intersection of LIS |
ユーザー |
![]() |
提出日時 | 2022-01-08 01:19:19 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
AC
|
実行時間 | 1,459 ms / 2,000 ms |
コード長 | 1,157 bytes |
コンパイル時間 | 121 ms |
コンパイル使用メモリ | 12,800 KB |
実行使用メモリ | 93,272 KB |
最終ジャッジ日時 | 2024-11-14 09:21:42 |
合計ジャッジ時間 | 22,734 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 37 |
ソースコード
import sys input = sys.stdin.readline N=int(input()) A=list(map(int,input().split())) # LIS(最長増加部分列) import bisect DP=[float("inf")]*N # DP[i]で、長さiのLISの最終要素の最小値. POS=[-1]*N for i in range(N): a=A[i] pos=bisect.bisect_left(DP,a) DP[pos]=a POS[i]=pos ANS=0 for i in range(N): if DP[i]!=float("inf"): # float("inf")でない最小のものがLISの長さ ANS=i LIST=[] x=ANS for i in range(N-1,-1,-1): if POS[i]==x: LIST.append(A[i]) x-=1 #print(LIST) A=[-a for a in A][::-1] DP=[float("inf")]*N # DP[i]で、長さiのLISの最終要素の最小値. POS=[-1]*N for i in range(N): a=A[i] pos=bisect.bisect_left(DP,a) DP[pos]=a POS[i]=pos ANS=0 for i in range(N): if DP[i]!=float("inf"): # float("inf")でない最小のものがLISの長さ ANS=i LIST2=[] x=ANS for i in range(N-1,-1,-1): if POS[i]==x: LIST2.append(A[i]) x-=1 SET=set(LIST) SET2=set([-x for x in LIST2]) ANS=[] A=[-a for a in A][::-1] for a in A: if a in SET and a in SET2: ANS.append(a) print(len(ANS)) print(*ANS)