結果
問題 | No.2248 max(C)-min(C) |
ユーザー |
![]() |
提出日時 | 2023-03-17 22:13:13 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 3,362 bytes |
コンパイル時間 | 335 ms |
コンパイル使用メモリ | 81,588 KB |
実行使用メモリ | 224,932 KB |
最終ジャッジ日時 | 2024-09-18 11:19:44 |
合計ジャッジ時間 | 36,831 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 4 WA * 47 |
ソースコード
import sysinput = sys.stdin.readlinefrom bisect import bisect_leftmod = 998244353class SegmentTree:def __init__(self, A, initialize=True, segfunc=min, ident=2000000000):self.N = len(A)self.LV = (self.N - 1).bit_length()self.N0 = 1 << self.LVself.segfunc = segfuncself.ident = identif initialize:self.data = [self.ident] * self.N0 + A + [self.ident] * (self.N0 - self.N)for i in range(self.N0 - 1, 0, -1):self.data[i] = segfunc(self.data[i * 2], self.data[i * 2 + 1])else:self.data = [self.ident] * (self.N0 * 2)def update(self, i, x):i += self.N0 - 1self.data[i] = xfor _ in range(self.LV):i >>= 1self.data[i] = self.segfunc(self.data[i * 2], self.data[i * 2 + 1])def get(self, i):return self.data[i + self.N0 - 1]# open interval [l, r)def query(self, l, r):l += self.N0 - 1r += self.N0 - 1ret_l = self.identret_r = self.identwhile l < r:if l & 1:ret_l = self.segfunc(ret_l, self.data[l])l += 1if r & 1:ret_r = self.segfunc(self.data[r - 1], ret_r)r -= 1l >>= 1r >>= 1return self.segfunc(ret_l, ret_r)# return smallest i(l <= i < r) s.t. check(A[i]) == Truedef binsearch(self, l, r, check):if not check(self.query(l, r)):return rl += self.N0 - 1val = self.identwhile True:if check(self.segfunc(val, self.data[l])):breakif l & 1:val = self.segfunc(val, self.data[l])l += 1l >>= 1while l < self.N0:newval = self.segfunc(val, self.data[l * 2])if not check(newval):val = newvall = (l << 1) + 1else:l <<= 1return l - self.N0 + 1N = int(input())A_ori = list(map(int, input().split()))B_ori = list(map(int, input().split()))X = []for a, b in zip(A_ori, B_ori):if a > b:a, b = b, aX.append((a, b, (a + b) // 2))X.sort(key=lambda x: x[2])A = []B = []AB = []for a, b, ab in X:A.append(a)B.append(b)AB.append(ab)ST_A_min = SegmentTree(A)ST_A_max = SegmentTree(A, initialize=True, segfunc=max, ident=-2000000000)ST_B_min = SegmentTree(B)ST_B_max = SegmentTree(B, initialize=True, segfunc=max, ident=-2000000000)prev = -1ans = 10 ** 10for i in range(N):if AB[i] == prev:continueif i != 0:mi_B = ST_B_min.query(1, i + 1)ma_B = ST_B_max.query(1, i + 1)if mi_B < AB[i]:prev = AB[i]continueelse:ma_B = -1ok = max(ma_B, AB[-1])ng = AB[i] - 1mid = (ok + ng) // 2while ok - ng > 1:r = bisect_left(AB, mid + 1)flg = 1if r != N:mi_A = ST_A_min.query(r+1, N+1)ma_A = ST_A_max.query(r+1, N+1)if mi_A < AB[i] or ma_A > mid:flg = 0if flg:ok = midelse:ng = midmid = (ok + ng) // 2ans = min(ans, ok - AB[i])prev = AB[i]print(ans)