結果
| 問題 |
No.837 Noelちゃんと星々2
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2021-07-06 15:30:21 |
| 言語 | Crystal (1.14.0) |
| 結果 |
AC
|
| 実行時間 | 37 ms / 2,000 ms |
| コード長 | 3,339 bytes |
| コンパイル時間 | 16,178 ms |
| コンパイル使用メモリ | 294,728 KB |
| 実行使用メモリ | 10,880 KB |
| 最終ジャッジ日時 | 2024-06-11 14:31:29 |
| 合計ジャッジ時間 | 14,410 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 29 |
ソースコード
def main(io)
n = io.get
y = io.get_a(n, Int64)
y.sort!
io.put_e 1 if y.all?(&.== y[0])
cy = CumulativeSum.new(y)
s = 10_i64**18
(1..n-1).each do |i|
m1 = i//2
s1 = -cy[0...m1] + cy[m1...i] - (i.odd? ? y[m1] : 0)
m2 = (n-i)//2+i
s2 = -cy[i...m2] + cy[m2...n] - ((n-i).odd? ? y[m2] : 0)
min_u(s, s1+s2)
end
io.put(s)
end
macro min_u(a, b)
{{a}} = Math.min({{a}}, {{b}})
end
macro max_u(a, b)
{{a}} = Math.max({{a}}, {{b}})
end
def cdiv(a : Int, b : Int)
(a + b - 1) // b
end
def isqrt(n : Int32)
m = 46340
r = (1..m).bsearch { |i| i**2 > n }
r.nil? ? m : r - 1
end
def isqrt(n : Int64)
m = 3037000499_i64
r = (1_i64..m).bsearch { |i| i**2 > n }
r.nil? ? m : r - 1
end
def powr(a : T, n : Int, i : T = T.multiplicative_identity) forall T
powr(a, n, i) { |a, b| a * b }
end
def powr(a : T, n : Int, i : T = T.multiplicative_identity, &block) forall T
return i if n == 0
r, b = i, a
while n > 0
r = yield r, b if n.bit(0) == 1
b = yield b, b
n >>= 1
end
r
end
def ext_gcd(a : T, b : T) forall T
if a == 0
{b, T.new(0), T.new(1)}
else
g, x, y = ext_gcd(b%a, a)
{g, y-(b//a)*x, x}
end
end
class CumulativeSum(T)
def initialize(a : Array(T))
@n = a.size
@s = Array.new(@n+1, T.zero)
@n.times.each do |i|
@s[i+1] = @s[i] + a[i]
end
end
getter n : Int32
def [](r : Range)
sc = Indexable.range_to_index_and_count(r, @n)
raise ArgumentError.new("Invalid range") if sc.nil?
start, count = sc
@s[start + count] - @s[start]
end
@s : Array(T)
end
class ProconIO
def initialize
@buf = [] of String
@index = 0
end
def get(k : T.class = Int32) forall T
get_v(k)
end
def get(*ks : T.class) forall T
ks.map { |k| get_v(k) }
end
macro define_getn
{% for i in (2..9) %}
def get{{i}}(k : T.class = Int32) forall T
get({% for j in (1..i) %}k{% if j < i %}, {% end %}{% end %})
end
{% end %}
end
define_getn
def get_a(n : Int, k : T.class = Int32) forall T
Array.new(n) { get_v(k) }
end
def get_c(n : Int, k : T.class = Int32) forall T
get_a(n, k)
end
def get_c(n : Int, *ks : T.class) forall T
a = Array.new(n) { get(*ks) }
ks.map_with_index { |_, i| a.map { |e| e[i] } }
end
macro define_getn_c
{% for i in (2..9) %}
def get{{i}}_c(n : Int, k : T.class = Int32) forall T
get_c(n, {% for j in (1..i) %}k{% if j < i %}, {% end %}{% end %})
end
{% end %}
end
define_getn_c
def get_m(r : Int, c : Int, k : T.class = Int32) forall T
Array.new(r) { get_a(c, k) }
end
def put(*vs)
vs.each.with_index do |v, i|
put_v(v)
print i < vs.size - 1 ? " " : "\n"
end
end
def put_e(*vs)
put(*vs)
exit
end
private def get_v(k : Int32.class); get_token.to_i32; end
private def get_v(k : Int64.class); get_token.to_i64; end
private def get_v(k : String.class); get_token; end
private def get_token
if @buf.size == @index
@buf = read_line.split
@index = 0
end
v = @buf[@index]
@index += 1
v
end
private def put_v(vs : Enumerable)
vs.each_with_index do |v, i|
print v
print " " if i < vs.size - 1
end
end
private def put_v(v)
print v
end
end
main(ProconIO.new)