結果
問題 | 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 = nself.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 = unitself.f = fdef update(self, i, x):i += self.numself.seg[i] = xwhile i:i >>= 1self.seg[i] = self.f(self.seg[i << 1], self.seg[(i << 1)+1])def query(self, l, r):ansl = ansr = self.unitl += self.numr += self.num-1if l == r:return self.seg[l]while l < r:if l & 1:ansl = self.f(ansl, self.seg[l])l += 1if ~r & 1:ansr = self.f(self.seg[r], ansr)r -= 1l >>= 1r >>= 1if l == r:ansl = self.f(ansl, self.seg[l])return self.f(ansl, ansr)def max_right(self, l, g):l += self.numll = l // (l & -l)ans = self.unitwhile g(self.f(ans, self.seg[ll])):ans = self.f(ans, self.seg[ll])ll += 1while ~ll & 1:ll >>= 1if ll == 1:return self.nwhile ll < self.num:ll <<= 1if g(self.f(ans, self.seg[ll])):ans = self.f(ans, self.seg[ll])ll += 1return ll-self.numdef f(x,y):xm1,xm2,xM=xym1,ym2,yM=yif xm1<ym1:m1=xm1m2=min(ym1,xm2)else:m1=ym1m2=min(xm1,ym2)return (m1,m2,max(xM,yM))MAX=10**9MIN=0n=int(input())p=list(map(int,input().split()))seg=SegmentTree(n,[(i,MAX,i)for i in p],(MAX,MAX,MIN),f)ans=0for l in range(n-1):r=seg.max_right(l, lambda x: x[2]<=x[0]+x[1])ans+=r-l-1print(ans)