結果

問題 No.2248 max(C)-min(C)
ユーザー shobonvipshobonvip
提出日時 2023-03-17 21:43:33
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 1,589 ms / 3,000 ms
コード長 4,165 bytes
コンパイル時間 184 ms
コンパイル使用メモリ 81,624 KB
実行使用メモリ 264,220 KB
最終ジャッジ日時 2023-10-18 14:15:54
合計ジャッジ時間 47,878 ms
ジャッジサーバーID
(参考情報)
judge11 / judge12
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 64 ms
67,772 KB
testcase_01 AC 65 ms
67,772 KB
testcase_02 AC 63 ms
67,772 KB
testcase_03 AC 144 ms
78,760 KB
testcase_04 AC 132 ms
78,808 KB
testcase_05 AC 105 ms
77,916 KB
testcase_06 AC 193 ms
79,616 KB
testcase_07 AC 161 ms
79,204 KB
testcase_08 AC 156 ms
78,780 KB
testcase_09 AC 151 ms
79,044 KB
testcase_10 AC 102 ms
77,896 KB
testcase_11 AC 173 ms
79,464 KB
testcase_12 AC 148 ms
78,772 KB
testcase_13 AC 155 ms
78,772 KB
testcase_14 AC 173 ms
79,580 KB
testcase_15 AC 162 ms
78,864 KB
testcase_16 AC 123 ms
78,708 KB
testcase_17 AC 170 ms
79,404 KB
testcase_18 AC 1,372 ms
154,408 KB
testcase_19 AC 315 ms
87,492 KB
testcase_20 AC 1,507 ms
193,432 KB
testcase_21 AC 1,469 ms
184,636 KB
testcase_22 AC 1,038 ms
163,836 KB
testcase_23 AC 676 ms
132,592 KB
testcase_24 AC 406 ms
93,828 KB
testcase_25 AC 1,420 ms
177,276 KB
testcase_26 AC 1,224 ms
146,676 KB
testcase_27 AC 1,362 ms
174,368 KB
testcase_28 AC 282 ms
84,588 KB
testcase_29 AC 1,263 ms
151,340 KB
testcase_30 AC 709 ms
118,660 KB
testcase_31 AC 1,534 ms
193,964 KB
testcase_32 AC 458 ms
95,676 KB
testcase_33 AC 647 ms
113,976 KB
testcase_34 AC 1,529 ms
194,224 KB
testcase_35 AC 1,544 ms
194,056 KB
testcase_36 AC 1,589 ms
193,964 KB
testcase_37 AC 873 ms
146,040 KB
testcase_38 AC 1,558 ms
181,280 KB
testcase_39 AC 1,554 ms
182,972 KB
testcase_40 AC 1,549 ms
186,028 KB
testcase_41 AC 1,323 ms
161,904 KB
testcase_42 AC 1,544 ms
183,216 KB
testcase_43 AC 1,365 ms
165,120 KB
testcase_44 AC 1,552 ms
185,140 KB
testcase_45 AC 1,150 ms
180,444 KB
testcase_46 AC 657 ms
127,100 KB
testcase_47 AC 1,530 ms
181,548 KB
testcase_48 AC 1,452 ms
264,220 KB
testcase_49 AC 1,529 ms
225,768 KB
testcase_50 AC 1,426 ms
223,924 KB
testcase_51 AC 1,435 ms
223,764 KB
testcase_52 AC 1,529 ms
221,620 KB
testcase_53 AC 362 ms
93,820 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

# https://github.com/tatyam-prime/SortedSet/blob/main/SortedMultiset.py
import math
from bisect import bisect_left, bisect_right, insort
from typing import Generic, Iterable, Iterator, TypeVar, Union, List

T = TypeVar('T')


class SortedMultiset(Generic[T]):
	BUCKET_RATIO = 50
	REBUILD_RATIO = 170
	
	def _build(self, a=None) -> None:
		"Evenly divide `a` into buckets."
		if a is None: a = list(self)
		size = self.size = len(a)
		bucket_size = int(math.ceil(math.sqrt(size/self.BUCKET_RATIO)))
		self.a = [a[size*i//bucket_size: size*(i+1)//bucket_size] for i in range(bucket_size)]
	
	def __init__(self, a: Iterable[T] = []) -> None:
		"Make a new SortedMultiset from iterable. / O(N) if sorted / O(N log N)"
		a = list(a)
		if not all(a[i] <= a[i+1] for i in range(len(a)-1)):
			a = sorted(a)
		self._build(a)
	
	def __iter__(self) -> Iterator[T]:
		for i in self.a:
			for j in i: yield j
	
	def __reversed__(self) -> Iterator[T]:
		for i in reversed(self.a):
			for j in reversed(i): yield j
	
	def __len__(self) -> int:
		return self.size
	
	def __repr__(self) -> str:
		return "SortedMultiset"+str(self.a)
	
	def __str__(self) -> str:
		s = str(list(self))
		return "{"+s[1: len(s)-1]+"}"
	
	def _find_bucket(self, x: T) -> List[T]:
		"Find the bucket which should contain x. self must not be empty."
		for a in self.a:
			if x <= a[-1]: return a
		return a
	
	def __contains__(self, x: T) -> bool:
		if self.size == 0: return False
		a = self._find_bucket(x)
		i = bisect_left(a, x)
		return i != len(a) and a[i] == x
	
	def count(self, x: T) -> int:
		"Count the number of x."
		return self.index_right(x)-self.index(x)
	
	def add(self, x: T) -> None:
		"Add an element. / O(√N)"
		if self.size == 0:
			self.a = [[x]]
			self.size = 1
			return
		a = self._find_bucket(x)
		insort(a, x)
		self.size += 1
		if len(a) > len(self.a)*self.REBUILD_RATIO:
			self._build()
	
	def discard(self, x: T) -> bool:
		"Remove an element and return True if removed. / O(√N)"
		if self.size == 0: return False
		a = self._find_bucket(x)
		i = bisect_left(a, x)
		if i == len(a) or a[i] != x: return False
		a.pop(i)
		self.size -= 1
		if len(a) == 0: self._build()
		return True
	
	def lt(self, x: T) -> Union[T, None]:
		"Find the largest element < x, or None if it doesn't exist."
		for a in reversed(self.a):
			if a[0] < x:
				return a[bisect_left(a, x)-1]
	
	def le(self, x: T) -> Union[T, None]:
		"Find the largest element <= x, or None if it doesn't exist."
		for a in reversed(self.a):
			if a[0] <= x:
				return a[bisect_right(a, x)-1]
	
	def gt(self, x: T) -> Union[T, None]:
		"Find the smallest element > x, or None if it doesn't exist."
		for a in self.a:
			if a[-1] > x:
				return a[bisect_right(a, x)]
	
	def ge(self, x: T) -> Union[T, None]:
		"Find the smallest element >= x, or None if it doesn't exist."
		for a in self.a:
			if a[-1] >= x:
				return a[bisect_left(a, x)]
	
	def __getitem__(self, x: int) -> T:
		"Return the x-th element, or IndexError if it doesn't exist."
		if x < 0: x += self.size
		if x < 0: raise IndexError
		for a in self.a:
			if x < len(a): return a[x]
			x -= len(a)
		raise IndexError
	
	def index(self, x: T) -> int:
		"Count the number of elements < x."
		ans = 0
		for a in self.a:
			if a[-1] >= x:
				return ans+bisect_left(a, x)
			ans += len(a)
		return ans
	
	def index_right(self, x: T) -> int:
		"Count the number of elements <= x."
		ans = 0
		for a in self.a:
			if a[-1] > x:
				return ans+bisect_right(a, x)
			ans += len(a)
		return ans


n = int(input())
a = list(map(int,input().split()))
b = list(map(int,input().split()))
for i in range(n):
	if a[i] > b[i]: a[i], b[i] = b[i], a[i]

s = SortedMultiset(a)
event = []
# 0 ... add
# 1 ... delete
for i in range(n):
	t = (a[i] + b[i]) // 2
	event.append((t << 31) + (1 << 30) + a[i])
	event.append((t << 31) + t)
	event.append((b[i] << 31) + (1 << 30) + t)
	event.append((b[i] << 31) + b[i])



event.sort()
mask = (1 << 30) - 1
ans = s.lt(10 ** 12) - s.gt(-1)
for i in event:
	typ = (i >> 30) & 1
	targ = i & mask
	if typ == 0:
		s.add(targ)
	else:
		s.discard(targ)
	v = s.lt(10 ** 12) - s.gt(-1)
	ans = min(ans, v)
	#print(v)
	
print(ans)
0