結果
問題 | No.1675 Strange Minimum Query |
ユーザー |
|
提出日時 | 2022-03-04 12:20:20 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,477 ms / 2,000 ms |
コード長 | 3,243 bytes |
コンパイル時間 | 288 ms |
コンパイル使用メモリ | 82,176 KB |
実行使用メモリ | 120,676 KB |
最終ジャッジ日時 | 2024-07-18 09:31:21 |
合計ジャッジ時間 | 28,735 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 34 |
ソースコード
#頂点は1-index,下段は0-indexclass LazySegTree:#単位元と結合と作用をここで定義Xunit = 0Aunit = 0def Xf(self,x,y):return min(x,y)#Xf = maxdef Af(self,a,b):return max(a,b)#AのXへの作用def operate(self,x,a):return max(x,a)def __init__(self,N):self.N = Nself.X = [self.Xunit] * (N + N)self.A = [self.Aunit] * (N + N)def build(self,seq):for i,x in enumerate(seq,self.N):self.X[i] = xfor i in range(self.N-1,0,-1):self.X[i] = self.Xf(self.X[i<<1],self.X[i<<1 | 1])def eval_at(self,i):return self.operate(self.X[i],self.A[i])def propagate_at(self,i):self.X[i] = self.eval_at(i)self.A[i<<1] = self.Af(self.A[i<<1],self.A[i])self.A[i<<1 | 1] = self.Af(self.A[i<<1 | 1],self.A[i])self.A[i] = self.Aunitdef eval(self):for i in range(1,N):self.propagate_at(i)def propagate_above(self,i):H = i.bit_length() - 1for h in range(H,0,-1):self.propagate_at(i >> h)def recalc_above(self,i):while i > 1:i >>= 1self.X[i] = self.Xf(self.eval_at(i << 1),self.eval_at(i << 1 | 1))def update(self,i,x):i += self.Nself.propagate_above(i)self.X[i] = xself.A[i] = self.Aunitself.recalc_above(i)def fold(self,L = 0,R = -1):if R == -1:R = self.NL += self.NR += self.Nself.propagate_above(L // (L & -L))self.propagate_above(R // (R & -R) -1)vL = 10 ** 9 + 1vR = 10 ** 9 + 1while L < R:if L & 1:vL = self.Xf(vL,self.eval_at(L))L += 1if R & 1:R -= 1vR = self.Xf(self.eval_at(R),vR)L >>= 1R >>= 1return self.Xf(vL,vR)def operate_range(self,L,R,x):#区間全体に作用させるL += self.NR += self.NL0 = L // (L & -L)R0 = R // (R & -R) - 1self.propagate_above(L0)self.propagate_above(R0)while L < R:if L & 1:self.A[L] = self.Af(self.A[L],x)L += 1if R & 1:R -= 1self.A[R] = self.Af(self.A[R],x)L >>= 1R >>= 1self.recalc_above(L0)self.recalc_above(R0)def write(self):print(self.X)def change(self,Xf,Xunit,Af,Aunit,operate):self.Xf = Xfself.Xunit = Xunitself.Af = Afself.Aunit = Aunitself.operate = operateimport sysrr = sys.stdinN,Q = map(int,rr.readline().split())query = []for _ in range(Q):l,r,b = map(int,rr.readline().split())query.append((b,l,r))query.sort(key = lambda s:s[0],reverse = True)seg = LazySegTree(N)for b,l,r in query:num = seg.fold(l-1,r)if num > b:print(-1)exit()seg.operate_range(l-1,r,b)seg.eval()ans = [seg.eval_at(i) for i in range(N,N+N)]for i in range(N):if ans[i] == 0:ans[i] = 10 ** 9print(*ans)