結果
| 問題 |
No.1668 Grayscale
|
| コンテスト | |
| ユーザー |
👑 |
| 提出日時 | 2021-09-12 21:17:31 |
| 言語 | Lua (LuaJit 2.1.1734355927) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 4,562 bytes |
| コンパイル時間 | 427 ms |
| コンパイル使用メモリ | 7,072 KB |
| 実行使用メモリ | 581,052 KB |
| 最終ジャッジ日時 | 2024-06-24 16:06:38 |
| 合計ジャッジ時間 | 15,553 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | -- * 2 |
| other | AC * 4 WA * 2 TLE * 3 -- * 13 |
ソースコード
local mmi, mma = math.min, math.max
local SCCD = {}
SCCD.create = function(self, n)
self.n = n
self.asked, self.root = {}, {}
self.edge, self.edge_asked = {}, {}
self.invedge, self.invedge_asked = {}, {}
for i = 1, n do
self.asked[i] = false
self.root[i] = 0
self.edge[i] = {}
self.edge_asked[i] = 0
self.invedge[i] = {}
self.invedge_asked[i] = 0
end
self.edgeinfo = {}
end
SCCD.addEdge = function(self, src, dst)
table.insert(self.edge[src], dst)
table.insert(self.invedge[dst], src)
table.insert(self.edgeinfo, src)
table.insert(self.edgeinfo, dst)
end
SCCD.dfs = function(self, spos, dfs_way)
local asked = self.asked
local edge, edge_asked = self.edge, self.edge_asked
local tasks = {spos}
while 0 < #tasks do
local src = tasks[#tasks]
asked[src] = true
table.remove(tasks)
if edge_asked[src] == #edge[src] then
table.insert(dfs_way, src)
else
table.insert(tasks, src)
edge_asked[src] = edge_asked[src] + 1
local dst = edge[src][edge_asked[src]]
if not asked[dst] then
table.insert(tasks, dst)
end
end
end
end
SCCD.invdfs = function(self, spos, rootid)
local asked, root = self.asked, self.root
local invedge, invedge_asked = self.invedge, self.invedge_asked
local tasks = {spos}
while 0 < #tasks do
local src = tasks[#tasks]
root[src] = rootid
table.remove(tasks)
while invedge_asked[src] < #invedge[src] do
invedge_asked[src] = invedge_asked[src] + 1
local dst = invedge[src][invedge_asked[src]]
if asked[dst] and root[dst] == 0 then
table.insert(tasks, src)
table.insert(tasks, dst)
break
end
end
end
end
SCCD.categorize = function(self)
local asked, root = self.asked, self.root
for src = 1, self.n do
if not asked[src] then
local dfs_way = {}
self:dfs(src, dfs_way)
for i = #dfs_way, 1, -1 do
local src = dfs_way[i]
if root[src] == 0 then
self:invdfs(src, src)
end
end
end
end
end
SCCD.make_group_graph = function(self)
self.gsize = {}
self.gedge = {}
self.gpcnt = {}
self.glen = {}
self.gmember = {}
local gsize, gmember, glen = self.gsize, self.gmember, self.glen
local gedge, gpcnt = self.gedge, self.gpcnt
local root = self.root
local edgeinfo = self.edgeinfo
for i = 1, self.n do
gsize[i] = 0
gedge[i], gpcnt[i] = {}, 0
glen[i] = 0
gmember[i] = {}
end
for i = 1, self.n do
local r = root[i]
gsize[r] = gsize[r] + 1
table.insert(gmember[r], i)
end
for i = 1, #edgeinfo, 2 do
local a, b = edgeinfo[i], edgeinfo[i + 1]
local ra, rb = root[a], root[b]
if ra ~= rb then
table.insert(gedge[ra], rb)
gpcnt[rb] = gpcnt[rb] + 1
end
end
end
SCCD.toposort = function(self)
self:make_group_graph()
local gsize, gedge, gpcnt = self.gsize, self.gedge, self.gpcnt
local glen = self.glen
local topoary = {}
self.topoary = topoary
local topo_tasks = {}
for i = 1, self.n do
if 0 < gsize[i] and gpcnt[i] == 0 then
table.insert(topo_tasks, i)
end
end
local topo_done = 0
while topo_done < #topo_tasks do
topo_done = topo_done + 1
local g = topo_tasks[topo_done]
topoary[topo_done] = g
for i = 1, #gedge[g] do
local dst = gedge[g][i]
glen[dst] = mma(glen[dst], glen[g] + 1)
gpcnt[dst] = gpcnt[dst] - 1
if gpcnt[dst] == 0 then
table.insert(topo_tasks, dst)
end
end
end
return topoary
end
SCCD.new = function(n)
local obj = {}
setmetatable(obj, {__index = SCCD})
obj:create(n)
return obj
end
local h, w, colmax = io.read("*n", "*n", "*n")
local n = h * w
local t = {}
for i = 1, h do
for j = 1, w do
t[(i - 1) * w + j] = io.read("*n")
end
end
local sccd = SCCD.new(n)
for i = 1, h do
for j = 1, w - 1 do
local left = (i - 1) * w + j
if t[left] < t[left + 1] then
sccd:addEdge(left, left + 1)
elseif t[left + 1] < t[left] then
sccd:addEdge(left + 1, left)
else
sccd:addEdge(left, left + 1)
sccd:addEdge(left + 1, left)
end
end
end
for j = 1, w do
for i = 1, h - 1 do
local top = (i - 1) * w + j
if t[top] < t[top + w] then
sccd:addEdge(top, top + w)
elseif t[top + w] < t[top] then
sccd:addEdge(top + w, top)
else
sccd:addEdge(top, top + w)
sccd:addEdge(top + w, top)
end
end
end
sccd:categorize()
sccd:toposort()
local ret = 0
for i = 1, n do
ret = mma(ret, sccd.glen[i])
end
print(ret + 1)