結果
問題 | No.2028 Even Choice |
ユーザー | siganai |
提出日時 | 2022-08-05 21:52:41 |
言語 | PyPy3 (7.3.15) |
結果 |
RE
|
実行時間 | - |
コード長 | 4,757 bytes |
コンパイル時間 | 592 ms |
コンパイル使用メモリ | 81,792 KB |
実行使用メモリ | 111,624 KB |
最終ジャッジ日時 | 2024-09-15 18:20:54 |
合計ジャッジ時間 | 7,367 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 429 ms
109,312 KB |
testcase_01 | AC | 440 ms
109,568 KB |
testcase_02 | AC | 399 ms
109,568 KB |
testcase_03 | AC | 219 ms
109,928 KB |
testcase_04 | AC | 211 ms
109,312 KB |
testcase_05 | AC | 233 ms
82,680 KB |
testcase_06 | AC | 387 ms
111,624 KB |
testcase_07 | AC | 246 ms
85,856 KB |
testcase_08 | AC | 278 ms
100,880 KB |
testcase_09 | AC | 362 ms
104,848 KB |
testcase_10 | AC | 188 ms
84,952 KB |
testcase_11 | AC | 215 ms
81,664 KB |
testcase_12 | AC | 168 ms
80,208 KB |
testcase_13 | AC | 343 ms
107,688 KB |
testcase_14 | AC | 232 ms
85,580 KB |
testcase_15 | AC | 65 ms
68,096 KB |
testcase_16 | AC | 65 ms
67,712 KB |
testcase_17 | AC | 64 ms
67,456 KB |
testcase_18 | AC | 65 ms
67,712 KB |
testcase_19 | AC | 68 ms
68,480 KB |
testcase_20 | AC | 77 ms
71,936 KB |
testcase_21 | AC | 77 ms
72,832 KB |
testcase_22 | AC | 74 ms
71,168 KB |
testcase_23 | RE | - |
testcase_24 | AC | 66 ms
67,328 KB |
testcase_25 | RE | - |
testcase_26 | AC | 64 ms
67,712 KB |
testcase_27 | AC | 64 ms
68,096 KB |
testcase_28 | RE | - |
testcase_29 | RE | - |
testcase_30 | RE | - |
ソースコード
import bisect import functools import heapq import itertools import math import operator import re import sys import typing from collections import Counter, defaultdict, deque from functools import reduce import sys input=sys.stdin.readline n,k = map(int,input().split()) a = list(map(int,input().split())) ans = 0 su = 0 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 ms = SortedMultiset() cnt = 0 for i in range(1,n)[::-1]: if i % 2: ans = max(ans,su + a[i]) if cnt < k - 1: su += a[i] ms.add(a[i]) cnt += 1 else: if ms[0] < a[i]: su += a[i] - ms[0] ms.discard(ms[0]) ms.add(a[i]) print(ans)