結果
| 問題 |
No.507 ゲーム大会(チーム決め)
|
| コンテスト | |
| ユーザー |
👑 |
| 提出日時 | 2020-04-19 19:21:18 |
| 言語 | Lua (LuaJit 2.1.1734355927) |
| 結果 |
AC
|
| 実行時間 | 2,041 ms / 3,000 ms |
| コード長 | 3,348 bytes |
| コンパイル時間 | 96 ms |
| コンパイル使用メモリ | 6,948 KB |
| 実行使用メモリ | 6,820 KB |
| 最終ジャッジ日時 | 2024-10-06 02:46:58 |
| 合計ジャッジ時間 | 12,039 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 19 |
ソースコード
local mfl, mce = math.floor, math.ceil
local mmi, mma = math.min, math.max
local bls, brs = bit.lshift, bit.rshift
local function lower_bound(ary, x)
local num = #ary
if x <= ary[1] then return 1 end
if ary[num] < x then return num + 1 end
local min, max = 1, num
while 1 < max - min do
local mid = brs(min + max, 1)
if ary[mid] < x then
min = mid
else
max = mid
end
end
return max
end
local SegTree = {}
SegTree.clearAll = function(self)
for i = self.stagenum, 1, -1 do
local cnt = bls(1, i - 1)
for j = 1, cnt do
self.stage[i][j] = true
end
end
end
SegTree.create = function(self, n)
local stagenum, mul = 1, 1
self.stage = {{}}
while mul < n do
mul, stagenum = mul * 2, stagenum + 1
self.stage[stagenum] = {}
end
self.stagenum = stagenum
self:clearAll()
end
SegTree.setValue = function(self, idx)
self.stage[self.stagenum][idx] = false
for i = self.stagenum - 1, 1, -1 do
local dst = brs(idx + 1, 1)
local rem = dst * 4 - 1 - idx
self.stage[i][dst] = self.stage[i + 1][idx] or self.stage[i + 1][rem]
idx = dst
end
end
SegTree.right_bound = function(self, left, right)
local retpos = left - 1
local stage, l, r = 1, left, right
local stagenum = self.stagenum
while true do
local sz = bls(1, stagenum - stage)
while (l - 1) % sz ~= 0 or r + 1 - l < sz do
stage = stage + 1
sz = bls(1, stagenum - stage)
end
if not self.stage[stage][mce(l / sz)] then
retpos = l + sz - 1
if retpos == right then break end
if l + sz <= r then stage, l, r = 1, l + sz, r
else break end
else
if sz ~= 1 then stage, l, r = stage + 1, l, l + sz - 2
else break end
end
end
return retpos + 1
end
SegTree.left_bound = function(self, left, right)
local retpos = right + 1
local stage, l, r = 1, left, right
local stagenum = self.stagenum
while true do
local sz = bls(1, stagenum - stage)
while r % sz ~= 0 or r + 1 - l < sz do
stage = stage + 1
sz = bls(1, stagenum - stage)
end
if not self.stage[stage][mfl(r / sz)] then
retpos = r - sz + 1
if l + sz <= r then stage, l, r = 1, l, r - sz
else break end
else
if sz ~= 1 then stage, l, r = stage + 1, r - sz + 2, r
else break end
end
end
return retpos - 1
end
SegTree.new = function(n)
local obj = {}
setmetatable(obj, {__index = SegTree})
obj:create(n)
return obj
end
local n, m = io.read("*n", "*n")
local a = io.read("*n")
local t = {}
n = n - 1
for i = 1, n do
t[i] = io.read("*n")
end
table.sort(t)
local st = SegTree
st:create(n)
local function judge(x)
local tgt = a + t[x] + 1
st:clearAll()
st:setValue(x)
local cnt = 0
for i = 1, m do
local rightpos = st:left_bound(1, n)
if rightpos <= 1 then return true end
st:setValue(rightpos)
local lbpos = lower_bound(t, tgt - t[rightpos])
if n < lbpos then return true end
local leftpos = st:right_bound(lbpos, n)
if n < leftpos then return true end
st:setValue(leftpos)
end
return false
end
if not judge(n) then
print(-1)
elseif judge(1) then
print(t[1])
else
local min, max = 1, n
while 1 < max - min do
local mid = brs(min + max, 1)
if judge(mid) then
max = mid
else
min = mid
end
end
print(t[max])
end