結果

問題 No.972 選び方のスコア
ユーザー tcltktcltk
提出日時 2021-09-24 06:14:28
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 307 ms / 2,000 ms
コード長 1,271 bytes
コンパイル時間 238 ms
コンパイル使用メモリ 81,536 KB
実行使用メモリ 137,856 KB
最終ジャッジ日時 2024-07-05 09:39:08
合計ジャッジ時間 11,532 ms
ジャッジサーバーID
(参考情報)
judge1 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 32
権限があれば一括ダウンロードができます

ソースコード

diff #

#!/usr/bin/env python3
# from typing import *

import sys
import io
import math
import collections
import decimal
import itertools
import bisect
import heapq


def input():
    return sys.stdin.readline()[:-1]

# sys.setrecursionlimit(1000000)

# _INPUT = """5
# 1 2 3 4 5
# """
# sys.stdin = io.StringIO(_INPUT)

INF = 10**10

def check1(i, k):
    v = A[i-k] + A[N-k] - A[i]*2
    return (v > 0)

def check2(i, k):
    v = A[i-k] + A[N-k] - (A[i] + A[i+1])
    return (v > 0)


N = int(input())
A = list(map(int, input().split()))
A.sort()
S = [0] + list(itertools.accumulate(A))

score_max = 0

# 奇数個数の部分列
for i in range(1, N-1):
    ok = 0
    ng = min(i, N-1-i) + 1
    while ng - ok > 1:
        mid = (ok+ng)//2
        if check1(i, mid):
            ok = mid
        else:
            ng = mid
    k = ok
    score = (S[i]-S[i-k]) + (S[N]-S[N-k]) - 2*k*A[i]
    score_max = max(score_max, score)

# 偶数個数の部分列
for i in range(1, N-2):
    ok = 0
    ng = min(i, N-2-i) + 1
    while ng - ok > 1:
        mid = (ok+ng)//2
        if check2(i, mid):
            ok = mid
        else:
            ng = mid
    k = ok
    score = (S[i]-S[i-k]) + (S[N]-S[N-k]) - k*(A[i]+A[i+1])
    score_max = max(score_max, score)



print(score_max)

0