結果
問題 | No.2028 Even Choice |
ユーザー | siganai |
提出日時 | 2022-08-05 21:52:41 |
言語 | PyPy3 (7.3.15) |
結果 |
RE
|
実行時間 | - |
コード長 | 4,757 bytes |
コンパイル時間 | 489 ms |
コンパイル使用メモリ | 87,164 KB |
実行使用メモリ | 118,412 KB |
最終ジャッジ日時 | 2023-10-13 22:36:06 |
合計ジャッジ時間 | 10,178 ms |
ジャッジサーバーID (参考情報) |
judge12 / judge15 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 494 ms
114,228 KB |
testcase_01 | AC | 510 ms
118,412 KB |
testcase_02 | AC | 460 ms
113,984 KB |
testcase_03 | AC | 286 ms
114,712 KB |
testcase_04 | AC | 288 ms
114,608 KB |
testcase_05 | AC | 302 ms
90,492 KB |
testcase_06 | AC | 446 ms
110,524 KB |
testcase_07 | AC | 317 ms
92,740 KB |
testcase_08 | AC | 349 ms
102,044 KB |
testcase_09 | AC | 425 ms
104,520 KB |
testcase_10 | AC | 263 ms
92,192 KB |
testcase_11 | AC | 295 ms
88,560 KB |
testcase_12 | AC | 250 ms
86,080 KB |
testcase_13 | AC | 409 ms
107,168 KB |
testcase_14 | AC | 302 ms
93,724 KB |
testcase_15 | AC | 152 ms
80,612 KB |
testcase_16 | AC | 153 ms
80,500 KB |
testcase_17 | AC | 154 ms
80,668 KB |
testcase_18 | AC | 155 ms
80,564 KB |
testcase_19 | AC | 157 ms
80,580 KB |
testcase_20 | AC | 163 ms
82,128 KB |
testcase_21 | AC | 168 ms
82,096 KB |
testcase_22 | AC | 163 ms
82,036 KB |
testcase_23 | RE | - |
testcase_24 | AC | 153 ms
80,496 KB |
testcase_25 | RE | - |
testcase_26 | AC | 154 ms
80,304 KB |
testcase_27 | AC | 159 ms
80,464 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)