結果
問題 | No.2101 [Cherry Alpha N] ずっとこの数列だったらいいのに |
ユーザー |
|
提出日時 | 2022-10-15 00:00:37 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 3,796 ms / 6,000 ms |
コード長 | 3,493 bytes |
コンパイル時間 | 180 ms |
コンパイル使用メモリ | 82,476 KB |
実行使用メモリ | 210,108 KB |
最終ジャッジ日時 | 2024-06-26 18:14:45 |
合計ジャッジ時間 | 110,560 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 42 |
ソースコード
class SegTree:""" define what you want to do with 0 index, ex) size = tree_size, func = min or max, sta = default_value """def __init__(self,size,func,sta):self.n = sizeself.size = 1 << size.bit_length()self.func = funcself.sta = staself.tree = [sta]*(2*self.size)def build(self, list):""" set list and update tree"""for i,x in enumerate(list,self.size):self.tree[i] = xfor i in range(self.size-1,0,-1):self.tree[i] = self.func(self.tree[i<<1],self.tree[i<<1 | 1])def set(self,i,x):i += self.sizeself.tree[i] = xwhile i > 1:i >>= 1self.tree[i] = self.func(self.tree[i<<1],self.tree[i<<1 | 1])def get(self,l,r):""" take the value of [l r) with func (min or max)"""l += self.sizer += self.sizeres = self.stawhile l < r:if l & 1:res = self.func(self.tree[l],res)l += 1if r & 1:res = self.func(self.tree[r-1],res)l >>= 1r >>= 1return resdef max_right(self, l, x):"""[l,r) が ok であるような最大の r を返す"""if l == self.n:return ll += self.sizeres = self.stacheck = Truewhile check or (l & -l) != l:check = Falsewhile l%2 == 0:l >>= 1if not self.func(res,self.tree[l]) < x:while l < self.size:l <<= 1if self.func(res,self.tree[l]) < x:res = self.func(res,self.tree[l])l += 1return l - self.sizeres = self.func(res,self.tree[l])l += 1return self.ndef min_left(self, r, x):"""(r が ok であるような最小の r を返す probably wrong"""if r == 0:return 0r += self.sizeres = self.stacheck = Truewhile check and (r & -r) != r:check = Falser -= 1while (r > 1 and r%2):r >>= 1if not self.func(res, self.tree[r]) < x:while r < self.size:r = 2*r + 1if self.func(res, self.tree[r]) < x:res = self.func(res, self.tree[r])r -= 1return r + 1 - self.sizeres = self.func(self.tree[r],res)return 0def func(x,y):return x+yn = int(input())AT = [list(map(int,input().split())) for i in range(n)]A = [a for a,t in AT]q = int(input())DLR = [list(map(int,input().split())) for i in range(q)]ans = [0]*qevent = []for i,(a,t) in enumerate(AT):if a == 0:continueevent.append([t,-1,i,0])event.append([t+a,-2,i,0])for i,(d,l,r) in enumerate(DLR):event.append([d,i,l,r])seg1 = SegTree(n,func,0)seg3 = SegTree(n,func,0)seg4 = SegTree(n,func,0)seg1.build([a for a,t in AT])event.sort()for day,ind,x,y in event:if ind == -1:seg3.set(x,1)seg4.set(x,day)elif ind == -2:seg1.set(x,0)seg3.set(x,0)seg4.set(x,0)else:l,r = x-1,ycount = seg1.get(l,r) -seg3.get(l,r)*(day+1) + seg4.get(l,r)ans[ind] = countfor i in ans:print(i)