結果
| 問題 | No.1435 Mmm...... | 
| コンテスト | |
| ユーザー |  tyawanmusi | 
| 提出日時 | 2020-10-22 16:48:16 | 
| 言語 | PyPy3 (7.3.15) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 385 ms / 2,000 ms | 
| コード長 | 1,698 bytes | 
| コンパイル時間 | 167 ms | 
| コンパイル使用メモリ | 81,920 KB | 
| 実行使用メモリ | 126,976 KB | 
| 最終ジャッジ日時 | 2024-07-21 09:20:16 | 
| 合計ジャッジ時間 | 8,757 ms | 
| ジャッジサーバーID (参考情報) | judge1 / judge3 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 4 | 
| other | AC * 24 | 
ソースコード
class SegmentTree:
  def __init__(self, n, p, unit, f):
    self.n = n
    self.num = 2**((n-1).bit_length())
    self.seg = [unit]*(self.num*2)
    for i in range(n):
      self.seg[self.num+i] = p[i]
    for i in range(self.num-1, 0, -1):
      self.seg[i] = f(self.seg[i << 1], self.seg[(i << 1)+1])
    self.unit = unit
    self.f = f
  def update(self, i, x):
    i += self.num
    self.seg[i] = x
    while i:
      i >>= 1
      self.seg[i] = self.f(self.seg[i << 1], self.seg[(i << 1)+1])
  def query(self, l, r):
    ansl = ansr = self.unit
    l += self.num
    r += self.num-1
    if l == r:
      return self.seg[l]
    while l < r:
      if l & 1:
        ansl = self.f(ansl, self.seg[l])
        l += 1
      if ~r & 1:
        ansr = self.f(self.seg[r], ansr)
        r -= 1
      l >>= 1
      r >>= 1
    if l == r:
      ansl = self.f(ansl, self.seg[l])
    return self.f(ansl, ansr)
  def max_right(self, l, g):
    l += self.num
    ll = l // (l & -l)
    ans = self.unit
    while g(self.f(ans, self.seg[ll])):
      ans = self.f(ans, self.seg[ll])
      ll += 1
      while ~ll & 1:
        ll >>= 1
      if ll == 1:
        return self.n
    while ll < self.num:
      ll <<= 1
      if g(self.f(ans, self.seg[ll])):
        ans = self.f(ans, self.seg[ll])
        ll += 1
    return ll-self.num
def f(x,y):
  xm1,xm2,xM=x
  ym1,ym2,yM=y
  if xm1<ym1:
    m1=xm1
    m2=min(ym1,xm2)
  else:
    m1=ym1
    m2=min(xm1,ym2)
  return (m1,m2,max(xM,yM))
MAX=10**9
MIN=0
n=int(input())
p=list(map(int,input().split()))
seg=SegmentTree(n,[(i,MAX,i)for i in p],(MAX,MAX,MIN),f)
ans=0
for l in range(n-1):
  r=seg.max_right(l, lambda x: x[2]<=x[0]+x[1])
  ans+=r-l-1
print(ans)
            
            
            
        