結果

問題 No.911 ラッキーソート
ユーザー 👑 obakyanobakyan
提出日時 2020-04-18 17:29:10
言語 Lua
(LuaJit 2.1.1696795921)
結果
AC  
実行時間 1,770 ms / 2,000 ms
コード長 3,939 bytes
コンパイル時間 403 ms
コンパイル使用メモリ 5,248 KB
実行使用メモリ 146,188 KB
最終ジャッジ日時 2024-10-04 00:02:05
合計ジャッジ時間 31,702 ms
ジャッジサーバーID
(参考情報)
judge1 / judge5
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
5,248 KB
testcase_01 AC 2 ms
5,248 KB
testcase_02 AC 2 ms
5,248 KB
testcase_03 AC 3 ms
5,248 KB
testcase_04 AC 3 ms
5,248 KB
testcase_05 AC 4 ms
5,248 KB
testcase_06 AC 3 ms
5,248 KB
testcase_07 AC 3 ms
5,248 KB
testcase_08 AC 3 ms
5,248 KB
testcase_09 AC 4 ms
5,248 KB
testcase_10 AC 2 ms
5,248 KB
testcase_11 AC 3 ms
5,248 KB
testcase_12 AC 3 ms
5,248 KB
testcase_13 AC 1,495 ms
146,056 KB
testcase_14 AC 1,466 ms
145,812 KB
testcase_15 AC 1,464 ms
145,468 KB
testcase_16 AC 1,390 ms
141,788 KB
testcase_17 AC 1,459 ms
141,888 KB
testcase_18 AC 1,443 ms
141,432 KB
testcase_19 AC 1,470 ms
141,804 KB
testcase_20 AC 1,408 ms
140,612 KB
testcase_21 AC 1,272 ms
137,200 KB
testcase_22 AC 1,308 ms
133,572 KB
testcase_23 AC 1,143 ms
125,840 KB
testcase_24 AC 1,038 ms
113,476 KB
testcase_25 AC 584 ms
73,280 KB
testcase_26 AC 495 ms
55,436 KB
testcase_27 AC 190 ms
27,484 KB
testcase_28 AC 95 ms
14,520 KB
testcase_29 AC 30 ms
6,144 KB
testcase_30 AC 7 ms
5,248 KB
testcase_31 AC 4 ms
5,248 KB
testcase_32 AC 3 ms
5,248 KB
testcase_33 AC 4 ms
5,248 KB
testcase_34 AC 2 ms
5,248 KB
testcase_35 AC 3 ms
5,248 KB
testcase_36 AC 3 ms
5,248 KB
testcase_37 AC 3 ms
5,248 KB
testcase_38 AC 1,770 ms
146,188 KB
testcase_39 AC 1,141 ms
128,208 KB
testcase_40 AC 25 ms
5,888 KB
testcase_41 AC 1,371 ms
140,516 KB
testcase_42 AC 772 ms
86,700 KB
testcase_43 AC 1,513 ms
145,344 KB
testcase_44 AC 928 ms
145,592 KB
testcase_45 AC 1,046 ms
142,144 KB
testcase_46 AC 1,146 ms
141,884 KB
testcase_47 AC 947 ms
144,908 KB
testcase_48 AC 813 ms
133,636 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

local bls, brs = bit.lshift, bit.rshift
local mfl, mce = math.floor, math.ceil
local band = bit.band
local function lltonumber(str)
  local ret = 0LL
  for i = 1, #str do
    ret = ret * 10LL + str:sub(i, i):byte() - 48
  end
  return ret
end
local n, l, r = io.read():match("(%d+) (%d+) (%d+)")
n = tonumber(n)
l = lltonumber(l)
r = lltonumber(r)
local t = {}
local countlim = 64
-- 1 or 3: can use "0", 2 or 3: can use "1"
for i = 1, countlim do
  t[i] = 3
end
local astr_all = io.read()
local allbits = {}
for astr in astr_all:gmatch("%d+") do
  allbits[#allbits + 1] = {}
  local i = #allbits
  if #astr < 11 then
    local a = tonumber(astr)
    for j = 1, countlim do
      allbits[i][j] = a % 2
      a = mfl(a / 2)
    end
  else
    local top = astr:sub(1, 9)
    local z = 10^(#astr - 9)
    top = tonumber(top)
    local bottom = astr:sub(10, #astr)
    bottom = tonumber(bottom)
    for j = 1, countlim do
      allbits[i][j] = bottom % 2
      if top % 2 == 1 then
        top = mfl(top / 2)
        bottom = bottom + z
        bottom = mfl(bottom / 2)
      else
        top = mfl(top / 2)
        bottom = mfl(bottom / 2)
      end
    end
  end
  -- local a = lltonumber(astr)
  -- allbits[#allbits + 1] = {}
  -- local i = #allbits
  -- for j = 1, countlim do
  --   allbits[i][j] = a % 2LL == 1LL and 1 or 0
  --   a = a / 2LL
  -- end
end
local valid = true
local t1, t2, t3 = {countlim}, {1}, {n}
while 0 < #t1 do
  local pos, left, right = t1[#t1], t2[#t2], t3[#t3]
  table.remove(t1) table.remove(t2) table.remove(t3)
  if left == right then
    if 1 < pos then
      table.insert(t1, pos - 1) table.insert(t2, left) table.insert(t3, right)
    end
  else
    local lval = allbits[left][pos]
    local rval = allbits[right][pos]
    if lval == rval then
      for i = left + 1, right - 1 do
        if allbits[i][pos] ~= lval then
          valid = false break
        end
      end
      if not valid then break end
      if 1 < pos then
        table.insert(t1, pos - 1) table.insert(t2, left) table.insert(t3, right)
      end
    else
      local turnpos = nil
      for i = left + 1, right do
        if allbits[i][pos] ~= allbits[i - 1][pos] then
          if turnpos then valid = false break
          else
            turnpos = i
          end
        end
      end
      if not valid then break end
      if lval == 0 then
        t[pos] = band(t[pos], 1)
      else
        t[pos] = band(t[pos], 2)
      end
      if t[pos] == 0 then valid = false break end
      if pos ~= 1 then
        table.insert(t1, pos - 1) table.insert(t2, left) table.insert(t3, turnpos - 1)
        table.insert(t1, pos - 1) table.insert(t2, turnpos) table.insert(t3, right)
      end
    end
  end
end
-- print(valid)
-- print(table.concat(t, " "))
local function getCount(max)
  local maxbits = {}
  for i = 1, countlim do
    maxbits[i] = max % 2LL == 1LL and 1 or 0
    max = max / 2LL
  end
  local dpmax, dpnormal = {}, {}
  for i = 1, countlim do
    dpmax[i] = 0
    dpnormal[i] = 0
  end
  dpmax[countlim] = 1LL
  dpnormal[countlim] = 0LL
  for i = countlim - 1, 1, -1 do
    if t[i] == 3 then
      dpmax[i] = dpmax[i + 1]
      dpnormal[i] = dpnormal[i + 1] * 2LL
      if maxbits[i] == 1 then
        dpnormal[i] = dpnormal[i] + dpmax[i + 1]
      end
    elseif t[i] == 2 then
      -- only "1" is available
      if maxbits[i] == 0 then
        dpmax[i] = 0
      else
        dpmax[i] = dpmax[i + 1]
      end
      dpnormal[i] = dpnormal[i + 1]
    else -- t[i] == 1
      -- only "0" is available
      if maxbits[i] == 0 then
        dpmax[i] = dpmax[i + 1]
        dpnormal[i] = dpnormal[i + 1]
      else
        dpmax[i] = 0
        dpnormal[i] = dpnormal[i + 1] + dpmax[i + 1]
      end
    end
  end
  return dpnormal[1] + dpmax[1]
end
if valid then
  local cnt = getCount(r)
  if 0 < l then
    cnt = cnt - getCount(l - 1)
  end
  local str = tostring(cnt):gsub("LL", "")
  print(str)
else
  print(0)
end
0