結果
問題 | No.2332 Make a Sequence |
ユーザー |
![]() |
提出日時 | 2023-08-10 18:54:51 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 939 ms / 2,000 ms |
コード長 | 3,349 bytes |
コンパイル時間 | 1,286 ms |
コンパイル使用メモリ | 82,048 KB |
実行使用メモリ | 175,588 KB |
最終ジャッジ日時 | 2024-11-17 03:43:54 |
合計ジャッジ時間 | 37,226 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 61 |
ソースコード
import sysreadline=sys.stdin.readlineclass Li_Chao_Tree:def __init__(self,N,X=None,inf=float("inf")):self.N=Nif X==None:self.X=[x for x in range(self.N)]else:self.X=Xself.idx={x:i for i,x in enumerate(self.X)}self.inf=infself.li_chao_tree=[(0,self.inf)]*(2*self.N)self.left,self.right=[None]*2*N,[None]*2*Nfor i in range(self.N,2*self.N):self.left[i]=self.X[i-self.N]self.right[i]=self.X[i-self.N]for i in range(self.N-1,0,-1):self.left[i]=self.left[i<<1]self.right[i]=self.right[i<<1|1]def add_line_one_segment(self,a,b,i):queue=[i]while queue:i=queue.pop()aa,bb=self.li_chao_tree[i]l=a*self.X[self.left[i]]+br=a*self.X[self.right[i]]+bll=aa*self.X[self.left[i]]+bbrr=aa*self.X[self.right[i]]+bbif ll<=l and rr<=r:continueif l<=ll and r<=rr:self.li_chao_tree[i]=(a,b)continuequeue.append(i<<1)queue.append(i<<1|1)def add_line(self,a,b,L=None,R=None):if L==None:L=self.Nelse:L+=self.Nif R==None:R=2*self.Nelse:R+=self.Nwhile L<R:if L%2:self.add_line_one_segment(a,b,L)L+=1if R%2:R-=1self.add_line_one_segment(a,b,R)L>>=1R>>=1def __call__(self,x):i=self.idx[x]+self.Nretu=self.infwhile i:a,b=self.li_chao_tree[i]retu=min(retu,a*x+b)i>>=1return retudef __getitem__(self,i):x=self.X[i]i+=self.Nretu=self.infwhile i:a,b=self.li_chao_tree[i]retu=min(retu,a*x+b)i>>=1return retudef __str__(self):li_chao_tree=[(0,inf)]*self.Nfor i,x in enumerate(self.X):ii=i+self.Nwhile ii:aa,bb=self.li_chao_tree[ii]a,b=li_chao_tree[i]if aa*x+bb<a*x+b:li_chao_tree[i]=aa,bbii>>=1return "["+", ".join(map(str,li_chao_tree))+"]"def Z_algorithm(lst):le=len(lst)LCP=[None]*leLCP[0]=leL,R=0,0for i in range(1,le):if i<R:x=LCP[i-L]if x<R-i:LCP[i]=xelif R-i<x:LCP[i]=R-ielse:while R<le and lst[R-i]==lst[R]:R+=1LCP[i]=R-iL=ielse:R=max(R,i)while R<le and lst[R-i]==lst[R]:R+=1LCP[i]=R-iL=ireturn LCPN,M=map(int,readline().split())A=list(map(int,readline().split()))B=list(map(int,readline().split()))C=list(map(int,readline().split()))Z=Z_algorithm(A+B)inf=float("inf")LCT=Li_Chao_Tree(M+1,inf=inf)dp=[inf]*(M+1)dp[0]=0for m in range(M):k=Z[N+m]LCT.add_line(C[m],dp[m]-m*C[m],m,m+k+1)dp[m+1]=LCT[m+1]if dp[M]==inf:ans=-1else:ans=dp[M]print(ans)