結果
問題 | No.844 split game |
ユーザー |
![]() |
提出日時 | 2022-10-26 11:04:00 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
WA
|
実行時間 | - |
コード長 | 22,306 bytes |
コンパイル時間 | 84 ms |
コンパイル使用メモリ | 14,848 KB |
実行使用メモリ | 39,040 KB |
最終ジャッジ日時 | 2024-07-04 02:00:49 |
合計ジャッジ時間 | 14,747 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 33 WA * 23 |
ソースコード
import bisectimport copyimport decimalimport fractionsimport heapqimport itertoolsimport mathimport randomimport sysimport timefrom collections import Counter,deque,defaultdictfrom functools import lru_cache,reducefrom heapq import heappush,heappop,heapify,heappushpop,_heappop_max,_heapify_maxdef _heappush_max(heap,item):heap.append(item)heapq._siftdown_max(heap, 0, len(heap)-1)def _heappushpop_max(heap, item):if heap and item < heap[0]:item, heap[0] = heap[0], itemheapq._siftup_max(heap, 0)return itemfrom math import gcd as GCDread=sys.stdin.readreadline=sys.stdin.readlinereadlines=sys.stdin.readlineswrite=sys.stdout.writeclass Segment_Tree:def __init__(self,N,f,e,lst=None,dynamic=False):self.f=fself.e=eself.N=Nif dynamic:self.segment_tree=defaultdict(lambda:self.e)else:if lst==None:self.segment_tree=[self.e]*2*self.Nelse:assert len(lst)<=self.Nself.segment_tree=[self.e]*self.N+[x for x in lst]+[self.e]*(N-len(lst))for i in range(self.N-1,0,-1):self.segment_tree[i]=self.f(self.segment_tree[i<<1],self.segment_tree[i<<1|1])def __getitem__(self,i):if type(i)==int:if -self.N<=i<0:return self.segment_tree[i+self.N*2]elif 0<=i<self.N:return self.segment_tree[i+self.N]else:raise IndexError("list index out of range")else:a,b,c=i.start,i.stop,i.stepif a==None:a=self.Nelse:a+=self.Nif b==None:b=self.N*2else:b+=self.Nreturn self.segment_tree[slice(a,b,c)]def __setitem__(self,i,x):if -self.N<=i<0:i+=self.N*2elif 0<=i<self.N:i+=self.Nelse:raise IndexError("list index out of range")self.segment_tree[i]=xwhile i>1:i>>= 1self.segment_tree[i]=self.f(self.segment_tree[i<<1],self.segment_tree[i<<1|1])def Build(self,lst):for i,x in enumerate(lst,self.N):self.segment_tree[i]=xfor i in range(self.N-1,0,-1):self.segment_tree[i]=self.f(self.segment_tree[i<<1],self.segment_tree[i<<1|1])def Fold(self,L=None,R=None):if L==None:L=self.Nelse:L+=self.Nif R==None:R=self.N*2else:R+=self.NvL=self.evR=self.ewhile L<R:if L&1:vL=self.f(vL,self.segment_tree[L])L+=1if R&1:R-=1vR=self.f(self.segment_tree[R],vR)L>>=1R>>=1return self.f(vL,vR)def Fold_Index(self,L=None,R=None):if L==None:L=self.Nelse:L+=self.Nif R==None:R=self.N*2else:R+=self.Nif L==R:return Nonex=self.Fold(L-self.N,R-self.N)while L<R:if L&1:if self.segment_tree[L]==x:i=LbreakL+=1if R&1:R-=1if self.segment_tree[R]==x:i=RbreakL>>=1R>>=1while i<self.N:if self.segment_tree[i]==self.segment_tree[i<<1]:i<<=1else:i<<=1i|=1i-=self.Nreturn idef Bisect_Right(self,L=None,f=None):if L==self.N:return self.Nif L==None:L=0L+=self.Nvl=self.evr=self.el,r=L,self.N*2while l<r:if l&1:vl=self.f(vl,self.segment_tree[l])l+=1if r&1:r-=1vr=self.f(self.segment_tree[r],vr)l>>=1r>>=1if f(self.f(vl,vr)):return self.Nv=self.ewhile True:while L%2==0:L>>=1vv=self.f(v,self.segment_tree[L])if f(vv):v=vvL+=1else:while L<self.N:L<<=1vv=self.f(v,self.segment_tree[L])if f(vv):v=vvL+=1return L-self.Ndef Bisect_Left(self,R=None,f=None):if R==0:return 0if R==None:R=self.NR+=self.Nvl=self.evr=self.el,r=self.N,Rwhile l<r:if l&1:vl=self.f(vl,self.segment_tree[l])l+=1if r&1:r-=1vr=self.f(self.segment_tree[r],vr)l>>=1r>>=1if f(self.f(vl,vr)):return 0v=self.ewhile True:R-=1while R>1 and R%2:R>>=1vv=self.f(self.segment_tree[R],v)if f(vv):v=vvelse:while R<self.N:R=2*R+1vv=self.f(self.segment_tree[R],v)if f(vv):v=vvR-=1return R+1-self.Ndef __str__(self):return "["+", ".join(map(str,self.segment_tree[self.N:]))+"]"class Segment_Tree2:def __init__(self,N,M,f,e,lst=None,dynamic=False):self.N=Nself.M=Mself.f=fself.e=eif dynamic:self.segment_tree=defaultdict(lambda:defaultdict(lambda:e))else:if lst==None:self.segment_tree=[[self.e]*2*self.M for i in range(2*self.N)]else:assert len(lst)<=self.Nassert all(len(lst[i])<=self.M for i in range(self.N))self.segment_tree=[[self.e]*2*self.M for i in range(self.N)]+[[self.e]*self.M+lst[i]+[self.e]*(self.M-len(lst[i])) for i in range(len(lst))]+[[self.e]*2*self.M for i in range(self.N-len(lst))]for i in range(self.N-1,0,-1):for j in range(2*self.M-1,self.M-1,-1):self.segment_tree[i][j]=self.f(self.segment_tree[i<<1][j],self.segment_tree[i<<1|1][j])for i in range(2*self.N-1,-1,-1):for j in range(self.M-1,0,-1):self.segment_tree[i][j]=self.f(self.segment_tree[i][j<<1],self.segment_tree[i][j<<1|1])def __getitem__(self,tpl):i,j=tpli+=self.Nj+=self.Mreturn self.segment_tree[i][j]def __setitem__(self,tpl,x):i,j=tpli+=self.Nj+=self.Mself.segment_tree[i][j]=xidxN=[i]idxM=[j]while i>1:i>>=1idxN.append(i)while j>1:j>>=1idxM.append(j)i=idxN[0]for j in idxM[1:]:self.segment_tree[i][j]=self.f(self.segment_tree[i][j<<1],self.segment_tree[i][j<<1|1])for i in idxN[1:]:for j in idxM:self.segment_tree[i][j]=self.f(self.segment_tree[i<<1][j],self.segment_tree[i<<1|1][j])def Build(self,lst):assert len(lst)<=self.Nassert all(len(lst[i] for i in range(self.N))<=self.M)for i in range(len(lst)):for j in range(len(lst[i])):self.segment_tree[i+self.N][j+self.M]=lst[i][j]for i in range(self.N-1,0,-1):for j in range(2*self.M-1,self.M-1,-1):self.segment_tree[i][j]=self.f(self.segment_tree[i<<1][j],self.segment_tree[i<<1|1][j])for i in range(2*self.N-1,-1,-1):for j in range(self.M-1,0,-1):self.segment_tree[i][j]=self.f(self.segment_tree[i][j<<1],self.segment_tree[i][j<<1|1])def Fold(self,LN=None,RN=None,LM=None,RM=None):LN+=self.NRN+=self.NLM+=self.MRM+=self.MidxN=[]idxM=[]while LN<RN:if LN&1:idxN.append(LN)LN+=1if RN&1:RN-=1idxN.append(RN)LN>>=1RN>>=1while LM<RM:if LM&1:idxM.append(LM)LM+=1if RM&1:RM-=1idxM.append(RM)LM>>=1RM>>=1retu=self.efor i in idxN:for j in idxM:retu=self.f(retu,self.segment_tree[i][j])return retudef Fold_Index(self,LN=None,RN=None,LM=None,RM=None):if LN==None:LN=self.Nelse:LN+=self.Nif RN==None:RN=self.N*2else:RN+=self.Nif LM==None:LM=self.Melse:LM+=self.Mif RM==None:RM=self.M*2else:RM+=self.Mif LN==RN and LM==RM:return NoneidxN=[]idxM=[]while LN<RN:if LN&1:idxN.append(LN)LN+=1if RN&1:RN-=1idxN.append(RN)LN>>=1RN>>=1while LM<RM:if LM&1:idxM.append(LM)LM+=1if RM&1:RM-=1idxM.append(RM)LM>>=1RM>>=1v=self.efor i in idxN:for j in idxM:v=self.f(v,self.segment_tree[i][j])for i in idxN:for j in idxM:if v==self.f(v,self.segment_tree[i][j]):breakelse:continuebreakwhile i<self.N:if self.segment_tree[i<<1][j]==v:i<<=1else:i<<=1i|=1while j<self.M:if self.segment_tree[i][j<<1]==v:j<<=1else:j<<=1j|=1return i,jdef __str__(self):m=max(len(str(self.segment_tree[i][j])) for i in range(self.N,self.N*2) for j in range(self.M,self.M*2))return "\n".join(["["+", ".join(map(lambda s:" "*(m-len(str(s)))+str(s),self.segment_tree[i][self.M:]))+"]" for i in range(self.N,self.N*2)])class Dual_Segment_Tree:def __init__(self,N,f_act,e_act,operate,lst):self.N=Nself.f_act=f_actself.e_act=e_actself.operate=operateself.lst=[None]*self.Nfor i,x in enumerate(lst):self.lst[i]=xself.segment_tree_act=[self.e_act]*(self.N+self.N)def __getitem__(self,i):if type(i) is int:if -self.N<=i<0:i+=self.N*2elif 0<=i<self.N:i+=self.Nelse:raise IndexError("list index out of range")self.Propagate_Above(i)return self.Operate_At(i)else:a,b,c=i.start,i.stop,i.stepif a==None or a<-self.N:a=0elif self.N<=a:a=self.Nelif a<0:a+=self.Nif b==None or self.N<=b:b=self.Nelif b<-self.N:b=0elif b<0:b+=self.Nreturn self.lst[slice(a,b,c)]def Operate_At(self,i):return self.operate(self.lst[i-self.N],self.segment_tree_act[i])def Propagate_At(self,i):self.segment_tree_act[i<<1]=self.f_act(self.segment_tree_act[i<<1],self.segment_tree_act[i])self.segment_tree_act[i<<1|1]=self.f_act(self.segment_tree_act[i<<1|1],self.segment_tree_act[i])self.segment_tree_act[i]=self.e_actdef Propagate_Above(self,i):H=i.bit_length()-1for h in range(H,0,-1):self.Propagate_At(i>>h)def Operate_Range(self,a,L=None,R=None):if L==None:L=self.Nelse:L+=self.Nif R==None:R=self.N*2else:R+=self.NL0=L//(L&-L)R0=R//(R&-R)-1self.Propagate_Above(L0)self.Propagate_Above(R0)while L<R:if L&1:self.segment_tree_act[L]=self.f_act(self.segment_tree_act[L],a)L+=1if R&1:R-=1self.segment_tree_act[R]=self.f_act(self.segment_tree_act[R],a)L>>=1R>>=1def Update(self):for i in range(1,self.N):self.Propagate_At(i)self.segment_tree_act[i]=self.e_actdef __str__(self):import copysegment_tree_act=copy.deepcopy(self.segment_tree_act)for i in range(1,self.N):segment_tree_act[i<<1]=self.f_act(segment_tree_act[i<<1],segment_tree_act[i])segment_tree_act[i<<1|1]=self.f_act(segment_tree_act[i<<1|1],segment_tree_act[i])segment_tree_act[i]=self.e_actsegment_tree_act[i]=self.e_actreturn "["+", ".join(map(str,[self.operate(x,a) for x,a in zip(self.lst,segment_tree_act[self.N:])]))+"]"class Lazy_Segment_Tree:def __init__(self,N,f,e,f_act,e_act,operate,lst=None):self.N=Nself.f=fself.e=eself.f_act=f_actself.e_act=e_actself.operate=operateself.segment_tree=[self.e]*(self.N+self.N)self.segment_tree_act=[self.e_act]*(self.N+self.N)if lst!=None:for i,x in enumerate(lst):self.segment_tree[i+self.N]=xfor i in range(self.N-1,0,-1):self.segment_tree[i]=self.f(self.segment_tree[i<<1],self.segment_tree[i<<1|1])self.segment_tree_act=[self.e_act]*(self.N+self.N)def __getitem__(self,i):if type(i) is int:if -self.N<=i<0:i+=self.N*2elif 0<=i<self.N:i+=self.Nelse:raise IndexError("list index out of range")self.Propagate_Above(i)self.Recalculate_Above(i)return self.Operate_At(i)else:a,b,c=i.start,i.stop,i.stepif a==None or a<-self.N:a=self.Nelif self.N<=a:a=self.N*2elif a<0:a+=self.N*2else:a+=self.Nif b==None or self.N<=b:b=self.N*2elif b<-self.N:b=self.Nelif b<0:b+=self.N*2else:b+=self.Nreturn self.segment_tree[slice(a,b,c)]def __setitem__(self,i,x):if -self.N<=i<0:i+=self.N*2elif 0<=i<self.N:i+=self.Nelse:raise IndexError("list index out of range")self.Propagate_Above(i)self.segment_tree[i]=xself.segment_tree_act[i]=self.e_actself.Recalculate_Above(i)def Operate_At(self,i):return self.operate(self.segment_tree[i],self.segment_tree_act[i])def Propagate_At(self,i):self.segment_tree[i]=self.Operate_At(i)self.segment_tree_act[i<<1]=self.f_act(self.segment_tree_act[i<<1],self.segment_tree_act[i])self.segment_tree_act[i<<1|1]=self.f_act(self.segment_tree_act[i<<1|1],self.segment_tree_act[i])self.segment_tree_act[i]=self.e_actdef Propagate_Above(self,i):H=i.bit_length()-1for h in range(H,0,-1):self.Propagate_At(i>>h)def Recalculate_Above(self,i):while i>1:i>>=1self.segment_tree[i]=self.f(self.Operate_At(i<<1),self.Operate_At(i<<1|1))def Build(self,lst):for i,x in enumerate(lst):self.segment_tree[i+self.N]=xfor i in range(self.N-1,0,-1):self.segment_tree[i]=self.f(self.segment_tree[i<<1],self.segment_tree[i<<1|1])self.segment_tree_act=[self.e_act]*(self.N+self.N)def Fold(self,L=None,R=None):if L==None:L=self.Nelse:L+=self.Nif R==None:R=self.N*2else:R+=self.Nself.Propagate_Above(L//(L&-L))self.Propagate_Above(R//(R&-R)-1)vL=self.evR=self.ewhile L<R:if L&1:vL=self.f(vL,self.Operate_At(L))L+=1if R&1:R-=1vR=self.f(self.Operate_At(R),vR)L>>=1R>>=1return self.f(vL,vR)def Fold_Index(self,L=None,R=None):if L==None:L=self.Nelse:L+=self.Nif R==None:R=self.N*2else:R+=self.Nif L==R:return Nonex=self.Fold(L-self.N,R-self.N)while L<R:if L&1:if self.segment_tree[L]==x:i=LbreakL+=1if R&1:R-=1if self.segment_tree[R]==x:i=RbreakL>>=1R>>=1while i<self.N:if self.segment_tree[i]==self.segment_tree[i<<1]:i<<=1else:i<<=1i|=1i-=self.Nreturn idef Operate_Range(self,a,L=None,R=None):if L==None:L=self.Nelse:L+=self.Nif R==None:R=self.N*2else:R+=self.NL0=L//(L&-L)R0=R//(R&-R)-1self.Propagate_Above(L0)self.Propagate_Above(R0)while L<R:if L&1:self.segment_tree_act[L]=self.f_act(self.segment_tree_act[L],a)L+=1if R&1:R-=1self.segment_tree_act[R]=self.f_act(self.segment_tree_act[R],a)L>>=1R>>=1self.Recalculate_Above(L0)self.Recalculate_Above(R0)def Update(self):for i in range(1,self.N):self.Propagate_At(i)for i in range(self.N,self.N*2):self.segment_tree[i]=self.Operate_At(i)self.segment_tree_act[i]=self.e_actfor i in range(self.N-1,0,-1):self.segment_tree[i]=self.f(self.segment_tree[i<<1],self.segment_tree[i<<1|1])def Bisect_Right(self,L=None,f=None):if L==self.N:return self.Nif L==None:L=0L+=self.Nself.Propagate_Above(L//(L&-L))self.Propagate_Above(self.N//(self.N&-self.N)-1)l,r=L,self.N*2vl=self.evr=self.ewhile l<r:if l&1:vl=self.f(vl,self.Operate_At(l))l+=1if r&1:r-=1vr=self.f(self.Operate_At(r),vr)l>>=1r>>=1if f(self.f(vl,vr)):return self.Nv=self.eself.Propagate_Above(L)while True:while L%2==0:L>>=1vv=self.f(v,self.Operate_At(L))if f(vv):v=vvL+=1else:while L<self.N:self.Propagate_At(L)L<<=1vv=self.f(v,self.Operate_At(L))if f(vv):v=vvL+=1return L-self.Ndef Bisect_Left(self,R=None,f=None):if R==0:return 0if R==None:R=self.NR+=self.Nself.Propagate_Above(self.N//(self.N&-self.N))self.Propagate_Above(R//(R&-R)-1)vl=self.evr=self.el,r=self.N,Rwhile l<r:if l&1:vl=self.f(vl,self.Operate_At(l))l+=1if r&1:r-=1vr=self.f(self.Operate_At(r),vr)l>>=1r>>=1if f(self.f(vl,vr)):return 0v=self.eself.Propagate_Above(R-1)while True:R-=1while R>1 and R%2:R>>=1vv=self.f(self.Operate_At(R),v)if f(vv):v=vvelse:while R<self.N:self.Propagate_At(R)R=(R<<1)|1vv=self.f(self.Operate_At(R),v)if f(vv):v=vvR-=1return R+1-self.Ndef __str__(self):import copysegment_tree=copy.deepcopy(self.segment_tree)segment_tree_act=copy.deepcopy(self.segment_tree_act)for i in range(1,self.N):segment_tree[i]=self.operate(segment_tree[i],segment_tree_act[i])segment_tree_act[i<<1]=self.f_act(segment_tree_act[i<<1],segment_tree_act[i])segment_tree_act[i<<1|1]=self.f_act(segment_tree_act[i<<1|1],segment_tree_act[i])segment_tree_act[i]=self.e_actfor i in range(self.N,self.N*2):segment_tree[i]=self.operate(segment_tree[i],segment_tree_act[i])segment_tree_act[i]=self.e_actfor i in range(self.N-1,0,-1):segment_tree[i]=self.f(segment_tree[i<<1],segment_tree[i<<1|1])return "["+", ".join(map(str,[self.operate(x,a) for x,a in zip(segment_tree[self.N:],segment_tree_act[self.N:])]))+"]"N,M,A=map(int,readline().split())P=[[] for r in range(N+1)]for m in range(M):l,r,p=map(int,readline().split())l-=1P[r].append([l,p])inf=1<<60ans=0dp=[-A]*(N+1)dp[0]=0for r in range(N+1):for l,p in P[r]:dp[r]=max(dp[r],dp[l]+p+(-A if r<N else 0))ans=max(ans,dp[r])print(ans)