from sys import stdin
n,l=map(int,stdin.readline().split())
on=n
p=[0]+list(map(int,stdin.readline().split()))+[l]
h=list(map(int,stdin.readline().split()))
d=[0]*(n+1)
for i in range(n+1):d[i]=p[i+1]-p[i]
maxh=0
for i in range(n-1,-1,-1):
while i<n:
if h[i]<=d[i] or h[i]<=d[i+1]:
hi=h.pop(i)
if hi>maxh:maxh=hi
d[i]+=d.pop(i+1)
n-=1
else:break
print(on-n)
print(maxh)
還是過不了
from sys import stdin
n,l=map(int,stdin.readline().split())
on=n
p=[0]+list(map(int,stdin.readline().split()))+[l]
h=list(map(int,stdin.readline().split()))
d=[0]*(n+1)
for i in range(n+1):d[i]=p[i+1]-p[i]
maxh=0
for i in range(n-1,-1,-1):
while i if h[i]<=d[i] or h[i]<=d[i+1]:
hi=h.pop(i)
if hi>maxh:maxh=hi
d[i]+=d.pop(i+1)
n-=1
else:break
print(on-n)
print(maxh)還是過不了
python list 的 pop() 方法的 time complexity 似乎為 $O(N)$(只有 pop 尾端是 $O(1)$),所以這樣這段程式最差會是 $O(N^2)$,並不會通過,這代表必須得找個更好的策略。
關於 pop() 方法的 time complexity 可以看這篇討論 : 連結
from sys import stdin
n,l=map(int,stdin.readline().split())
on=n
p=[0]+list(map(int,stdin.readline().split()))+[l]
h=list(map(int,stdin.readline().split()))
d=[0]*(n+1)
for i in range(n+1):d[i]=p[i+1]-p[i]
maxh=0
for i in range(n-1,-1,-1):
while i if h[i]<=d[i] or h[i]<=d[i+1]:
hi=h.pop(i)
if hi>maxh:maxh=hi
d[i]+=d.pop(i+1)
n-=1
else:break
print(on-n)
print(maxh)還是過不了
python list 的 pop() 方法的 time complexity 似乎為 $O(N)$(只有 pop 尾端是 $O(1)$),所以這樣這段程式最差會是 $O(N^2)$,並不會通過,這代表必須得找個更好的策略。
關於 pop() 方法的 time complexity 可以看這篇討論 : 連結
謝謝,我再試試看其他方法
from sys import stdin
n,l=map(int,stdin.readline().split())
on=n
p=[0]+list(map(int,stdin.readline().split()))+[l]
h=list(map(int,stdin.readline().split()))
d=[0]*(n+1)
for i in range(n+1):d[i]=p[i+1]-p[i]
maxh=0
for i in range(n-1,-1,-1):
while i if h[i]<=d[i] or h[i]<=d[i+1]:
hi=h.pop(i)
if hi>maxh:maxh=hi
d[i]+=d.pop(i+1)
n-=1
else:break
print(on-n)
print(maxh)還是過不了
python list 的 pop() 方法的 time complexity 似乎為 $O(N)$(只有 pop 尾端是 $O(1)$),所以這樣這段程式最差會是 $O(N^2)$,並不會通過,這代表必須得找個更好的策略。
關於 pop() 方法的 time complexity 可以看這篇討論 : 連結謝謝,我再試試看其他方法
我不使用pop 結果更慢了
吐血 弄了三個禮拜
要用雙向鏈結串列
不能不停地掃
每次砍掉樹回去看背後有沒有樹可以連鎖反應砍