結果

問題 No.674 n連勤
ユーザー Navier_Boltzmann
提出日時 2024-04-11 22:20:49
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 1,058 ms / 2,000 ms
コード長 2,799 bytes
コンパイル時間 263 ms
コンパイル使用メモリ 82,660 KB
実行使用メモリ 132,672 KB
最終ジャッジ日時 2024-10-02 21:43:22
合計ジャッジ時間 8,608 ms
ジャッジサーバーID
(参考情報)
judge3 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 17
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

# import pypyjit
# pypyjit.set_param("max_unroll_recursion=-1")
from collections import *
from functools import *
from itertools import *
from heapq import *
import sys, math
# sys.setrecursionlimit(3*10**5)
input = sys.stdin.readline
class SegTree:
"""
Segment Tree
"""
def __init__(self, init_val, segfunc, ide_ele):
"""
init_val:
"""
n = len(init_val)
self.segfunc = segfunc
self.ide_ele = ide_ele
self.num = 1 << (n - 1).bit_length()
self.tree = [ide_ele] * 2 * self.num
#
for i in range(n):
self.tree[self.num + i] = init_val[i]
#
for i in range(self.num - 1, 0, -1):
self.tree[i] = segfunc(self.tree[2 * i], self.tree[2 * i + 1])
def update(self, k, x):
"""
kx
k: index(0-index)
x: update value
"""
k += self.num
self.tree[k] = x
while k > 1:
tk = k>>1
self.tree[tk] = self.segfunc(self.tree[tk<<1], self.tree[(tk<<1)+1])
k >>= 1
def query(self, l, r):
"""
[l, r)segfunc
l: index(0-index)
r: index(0-index)
"""
res_l = self.ide_ele
res_r = self.ide_ele
l += self.num
r += self.num
while l < r:
if l & 1:
res_l = self.segfunc(res_l, self.tree[l])
l += 1
if r & 1:
res_r = self.segfunc(self.tree[r - 1], res_r)
l >>= 1
r >>= 1
res = self.segfunc(res_l,res_r)
return res
class LargestSubarray:
ide_ele = (0,0,0,0)
def segfunc(self,x,y):
z = [0,0,0,0]
z[0] = max(x[0],y[0],x[2]+y[1])
z[1] = max(x[1],x[3]+y[1])
z[2] = max(y[2],x[2]+y[3])
z[3] = x[3]+y[3]
return tuple(z)
def __init__(self,A):
self.T = SegTree([(a,a,a,a) for a in A],self.segfunc,self.ide_ele)
def update(self,k,x):
self.T.update(k,(x,x,x,x))
def query(self,l,r):
return self.T.query(l,r)[0]
D,Q = map(int,input().split())
AB = [tuple(map(int,input().split())) for _ in range(Q)]
X = []
for a,b in AB:
X.append(a)
X.append(b+1)
X = list(set(X))
X.sort()
inv = {x:i for i,x in enumerate(X)}
N = len(X)
I = [X[i+1]-X[i] for i in range(N-1)]+[0]
S = SegTree([(0,i) for i in range(N)],min,(1,N))
T = LargestSubarray([-D]*N)
for a,b in AB:
v,idx = S.query(inv[a],inv[b+1])
while v==0:
T.update(idx,I[idx])
S.update(idx,(1,idx))
v,idx = S.query(inv[a],inv[b+1])
print(T.query(0,N))
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0