結果
問題 | No.674 n連勤 |
ユーザー |
![]() |
提出日時 | 2023-05-09 11:35:50 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 377 ms / 2,000 ms |
コード長 | 3,391 bytes |
コンパイル時間 | 360 ms |
コンパイル使用メモリ | 82,432 KB |
実行使用メモリ | 100,096 KB |
最終ジャッジ日時 | 2024-11-25 23:04:05 |
合計ジャッジ時間 | 4,320 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 17 |
ソースコード
class BIT: #0-indexeddef __init__(self, n):self.size = nself.tree = [0]*(n+1)self.depth = n.bit_length()self.n0 = 1<<self.depth# self.element = [0]*(n+1)def get_sum(self, i): #a_0 + ... + a_{i} #閉区間s = 0; i += 1while i > 0:s += self.tree[i]i -= i & -ireturn sdef query(self,l,r): #a_l + ... + a_r 閉区間return self.get_sum(r) - self.get_sum(l-1)def add(self, i, x):i += 1while i <= self.size:self.tree[i] += xi += i & -i# self.element[i] += x#def get(self,i): return element[i]def bisect_left(self,w):#和が w 以上になる最小の index#w が存在しない場合 self.size を返すif w <= 0: return 0x,k = 0,self.n0for _ in range(self.depth):k >>= 1if x+k <= self.size and self.tree[x+k] < w:w -= self.tree[x+k]x += kreturn xclass interval_manager: #0-indexeddef __init__(self, n, A=None):self.n = nself.isL = BIT(n)INIT_DATA() # グローバル関数でグローバル変数を初期化しちゃうif A is not None:assert len(A) == nself.val = A[::]self.nxt = list(range(1,n+1))for i in range(1,n+1): # isL[i] = 1 となるように初期化self.isL.tree[i] = i&-ielse: # 全て 0 で初期化self.val = [0]*nself.nxt = [0]*nself.nxt[0] = nself.isL.add(0,1)def left(self,i): # i を含む半開区間の左端return self.isL.bisect_left(self.isL.get_sum(i))def right(self,i): # i を含む半開区間の右端return self.nxt[self.left(i)]def get(self,i): # A[i] の値を返すreturn self.val[self.left(i)]def _cut(self,L,i): # 区間 [L,nxt[L]) を i で切る.self.nxt[i] = self.nxt[L]self.nxt[L] = iself.val[i] = self.val[L]self.isL.add(i,1)def update(self,L,R,x):# cutLL = self.left(L)if L != LL:self._cut(LL,L)RL = self.left(R-1)if R != self.nxt[RL]:self._cut(RL,R)### connectif L:LL = self.left(L-1)if self.val[LL] == x:L = LLif R != self.n and self.val[R] == x:R = self.nxt[R]### delete and addLL = Lwhile True:nxt = self.nxt[L]DELETE(L,nxt,self.val[L])L = nxtif L == R: breakself.isL.add(L,-1)ADD(LL,R,x)self.nxt[LL] = Rself.val[LL] = x#####################################import sysreadline = sys.stdin.readlineD,Q = map(int,readline().split())def INIT_DATA():returndef DELETE(L,R,x):returndef ADD(L,R,x):global ansans = max(ans,x*(sa[R]-sa[L]))a = [0]*Qb = [0]*Qfor i in range(Q):a[i],b[i] = map(int,readline().split())b[i] += 1INF = 1<<60sa = sorted(set([0]+a+b+[INF]))za = {v:i for i,v in enumerate(sa)}data = interval_manager(len(sa))ans = 0for l,r in zip(a,b):il = za[l]ir = za[r]data.update(il,ir,1)print(ans)