提出 #22590409
ソースコード 拡げる
# Reference: https://github.com/shakayami/ACL-for-python/blob/master/segtree.py
class segtree():
n=1
size=1
log=2
d=[0]
op=None
e=10**15
def __init__(self,V,OP,E):
self.n=len(V)
self.op=OP
self.e=E
self.log=(self.n-1).bit_length()
self.size=1<<self.log
self.d=[E for i in range(2*self.size)]
for i in range(self.n):
self.d[self.size+i]=V[i]
for i in range(self.size-1,0,-1):
self.update(i)
def set(self,p,x):
assert 0<=p and p<self.n
p+=self.size
self.d[p]=x
for i in range(1,self.log+1):
self.update(p>>i)
def get(self,p):
assert 0<=p and p<self.n
return self.d[p+self.size]
def prod(self,l,r):
assert 0<=l and l<=r and r<=self.n
sml=self.e
smr=self.e
l+=self.size
r+=self.size
while(l<r):
if (l&1):
sml=self.op(sml,self.d[l])
l+=1
if (r&1):
smr=self.op(self.d[r-1],smr)
r-=1
l>>=1
r>>=1
return self.op(sml,smr)
def all_prod(self):
return self.d[1]
def max_right(self,l,f):
assert 0<=l and l<=self.n
assert f(self.e)
if l==self.n:
return self.n
l+=self.size
sm=self.e
while(1):
while(l%2==0):
l>>=1
if not(f(self.op(sm,self.d[l]))):
while(l<self.size):
l=2*l
if f(self.op(sm,self.d[l])):
sm=self.op(sm,self.d[l])
l+=1
return l-self.size
sm=self.op(sm,self.d[l])
l+=1
if (l&-l)==l:
break
return self.n
def min_left(self,r,f):
assert 0<=r and r<self.n
assert f(self.e)
if r==0:
return 0
r+=self.size
sm=self.e
while(1):
r-=1
while(r>1 & (r%2)):
r>>=1
if not(f(self.op(self.d[r],sm))):
while(r<self.size):
r=(2*r+1)
if f(self.op(self.d[r],sm)):
sm=self.op(self.d[r],sm)
r-=1
return r+1-self.size
sm=self.op(self.d[r],sm)
if (r& -r)==r:
break
return 0
def update(self,k):
self.d[k]=self.op(self.d[2*k],self.d[2*k+1])
inf = 10**18
ans = inf
N = int(input())
P = list(map(int,input().split()))
A = [0]*N
B = [0]*N
C = [0]*N
pos = [0]*(N+1)
for i in range(N):
A[i],B[i],C[i] = map(int,input().split())
sumA = [0]*(N+1)
sumB = [0]*(N+1)
sumC = [0]*(N+1)
dp = [inf]*(N+1)
seg = segtree(dp,min,inf)
for i in range(N):
sumA[i+1] = sumA[i]+A[i]
sumB[i+1] = sumB[i]+min(A[i],B[i])
sumC[i+1] = sumC[i]+min(A[i],C[i])
pos[P[i]] = i+1
for i in range(N):
dp[i+1] = min(sumB[i],sumA[i]+seg.prod(0,pos[i+1]))
ans = min(ans,dp[i+1]+sumC[N]-sumC[i+1])
seg.set(pos[i+1],dp[i+1]-sumA[i+1])
print(ans)
提出情報
ジャッジ結果
| セット名 |
Sample |
All |
| 得点 / 配点 |
0 / 0 |
600 / 600 |
| 結果 |
|
|
| セット名 |
テストケース |
| Sample |
example0.txt, example1.txt, example2.txt, example3.txt |
| All |
000.txt, 001.txt, 002.txt, 003.txt, 004.txt, 005.txt, 006.txt, 007.txt, 008.txt, 009.txt, 010.txt, 011.txt, 012.txt, 013.txt, 014.txt, 015.txt, 016.txt, 017.txt, 018.txt, 019.txt, 020.txt, 021.txt, 022.txt, example0.txt, example1.txt, example2.txt, example3.txt |
| ケース名 |
結果 |
実行時間 |
メモリ |
| 000.txt |
AC |
312 ms |
95740 KiB |
| 001.txt |
AC |
553 ms |
129024 KiB |
| 002.txt |
AC |
518 ms |
128120 KiB |
| 003.txt |
AC |
406 ms |
102176 KiB |
| 004.txt |
AC |
404 ms |
101916 KiB |
| 005.txt |
AC |
117 ms |
70116 KiB |
| 006.txt |
AC |
252 ms |
86036 KiB |
| 007.txt |
AC |
395 ms |
101524 KiB |
| 008.txt |
AC |
52 ms |
62664 KiB |
| 009.txt |
AC |
54 ms |
62568 KiB |
| 010.txt |
AC |
54 ms |
62624 KiB |
| 011.txt |
AC |
52 ms |
62816 KiB |
| 012.txt |
AC |
50 ms |
62588 KiB |
| 013.txt |
AC |
582 ms |
132316 KiB |
| 014.txt |
AC |
582 ms |
132192 KiB |
| 015.txt |
AC |
594 ms |
131992 KiB |
| 016.txt |
AC |
501 ms |
132084 KiB |
| 017.txt |
AC |
512 ms |
131952 KiB |
| 018.txt |
AC |
502 ms |
132080 KiB |
| 019.txt |
AC |
493 ms |
132232 KiB |
| 020.txt |
AC |
581 ms |
132164 KiB |
| 021.txt |
AC |
576 ms |
132164 KiB |
| 022.txt |
AC |
566 ms |
132196 KiB |
| example0.txt |
AC |
55 ms |
62808 KiB |
| example1.txt |
AC |
55 ms |
62576 KiB |
| example2.txt |
AC |
55 ms |
62900 KiB |
| example3.txt |
AC |
55 ms |
62760 KiB |