結果
問題 | No.1074 増殖 |
ユーザー |
![]() |
提出日時 | 2020-06-05 22:15:24 |
言語 | PyPy3 (7.3.15) |
結果 |
RE
|
実行時間 | - |
コード長 | 5,799 bytes |
コンパイル時間 | 494 ms |
コンパイル使用メモリ | 82,056 KB |
実行使用メモリ | 115,356 KB |
最終ジャッジ日時 | 2024-12-17 15:51:04 |
合計ジャッジ時間 | 6,659 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 3 WA * 8 RE * 1 |
ソースコード
import sysfrom operator import addreadline = sys.stdin.readlineclass Lazysegtree:#RUQdef __init__(self, A, intv, initialize = True, segf = add):#区間は 1-indexed で管理self.N = len(A)self.N0 = 2**(self.N-1).bit_length()self.intv = intvself.segf = segfself.lazy = [None]*(2*self.N0)if initialize:self.data = [intv]*self.N0 + A + [intv]*(self.N0 - self.N)for i in range(self.N0-1, -1, -1):self.data[i] = self.segf(self.data[2*i], self.data[2*i+1])else:self.data = [intv]*(2*self.N0)def _ascend(self, k):k = k >> 1c = k.bit_length()for j in range(c):idx = k >> jself.data[idx] = self.segf(self.data[2*idx], self.data[2*idx+1])def _descend(self, k):k = k >> 1idx = 1c = k.bit_length()for j in range(1, c+1):idx = k >> (c - j)if self.lazy[idx] is None:continueself.data[2*idx] = self.data[2*idx+1] = self.lazy[2*idx] \= self.lazy[2*idx+1] = self.lazy[idx]self.lazy[idx] = Nonedef query(self, l, r):L = l+self.N0R = r+self.N0self._descend(L//(L & -L))self._descend(R//(R & -R)-1)s = self.intvwhile L < R:if R & 1:R -= 1s = self.segf(s, self.data[R])if L & 1:s = self.segf(s, self.data[L])L += 1L >>= 1R >>= 1return sdef update(self, l, r, x):L = l+self.N0R = r+self.N0Li = L//(L & -L)Ri = R//(R & -R)self._descend(Li)self._descend(Ri-1)while L < R :if R & 1:R -= 1self.data[R] = xself.lazy[R] = xif L & 1:self.data[L] = xself.lazy[L] = xL += 1L >>= 1R >>= 1self._ascend(Li)self._ascend(Ri-1)class Segtree:def __init__(self, A, intv, initialize = True, segf = max):self.N = len(A)self.N0 = 2**(self.N-1).bit_length()self.intv = intvself.segf = segfif initialize:self.data = [intv]*self.N0 + A + [intv]*(self.N0 - self.N)for i in range(self.N0-1, 0, -1):self.data[i] = self.segf(self.data[2*i], self.data[2*i+1])else:self.data = [intv]*(2*self.N0)def update(self, k, x):k += self.N0self.data[k] = xwhile k > 0 :k = k >> 1self.data[k] = self.segf(self.data[2*k], self.data[2*k+1])def query(self, l, r):L, R = l+self.N0, r+self.N0s = self.intvwhile L < R:if R & 1:R -= 1s = self.segf(s, self.data[R])if L & 1:s = self.segf(s, self.data[L])L += 1L >>= 1R >>= 1return sdef binsearch(self, l, r, check, reverse = False):L, R = l+self.N0, r+self.N0SL, SR = [], []while L < R:if R & 1:R -= 1SR.append(R)if L & 1:SL.append(L)L += 1L >>= 1R >>= 1if reverse:for idx in (SR + SL[::-1]):if check(self.data[idx]):breakelse:return -1while idx < self.N0:if check(self.data[2*idx+1]):idx = 2*idx + 1else:idx = 2*idxreturn idx - self.N0else:pre = self.data[l+self.N0]for idx in (SL + SR[::-1]):if not check(self.segf(pre, self.data[idx])):pre = self.segf(pre, self.data[idx])else:breakelse:return -1while idx < self.N0:if check(self.segf(pre, self.data[2*idx])):idx = 2*idxelse:pre = self.segf(pre, self.data[2*idx])idx = 2*idx + 1return idx - self.N0def compress(L):L2 = list(set(L))L2.sort()C = {v : k for k, v in enumerate(L2)}return L2, Cdef calc(Ax, Ay):N = len(Ax)Lx, Cx = compress(Ax)Lx.append(0)table = Segtree([None]*N, 0, initialize = False, segf = max)T = Lazysegtree([None]*(N+1), 0, initialize = False)N0 = T.N0ans = [0]*Nfor i in range(N):x, y = Ax[i], Ay[i]xidx = Cx[x]if table.query(xidx, N0) >= y:ans[i] = ans[i-1]continuepidx = table.binsearch(0, xidx, lambda x: x > y, reverse = True) + 1table.update(xidx, y)T.update(pidx, xidx+1, 0)T.update(xidx, xidx+1, (Lx[xidx] - Lx[pidx-1])*y)ans[i] = T.query(0, N0)return ansN = int(readline())XaYaXbYb = [tuple(map(int, readline().split())) for _ in range(N)]Xa, Ya, Xb, Yb = map(list, zip(*XaYaXbYb))Xa = [-x for x in Xa]Ya = [-y for y in Ya]Ans = [0]*Nans1 = calc(Xb, Yb)ans2 = calc(Xb, Ya)ans3 = calc(Xa, Yb)ans4 = calc(Xa, Ya)for i in range(N):Ans[i] = ans1[i] + ans2[i] + ans3[i] + ans4[i]Ans = [0] + AnsAns = [a2 - a1 for a1, a2 in zip(Ans, Ans[1:])]print('\n'.join(map(str, Ans)))