結果

問題 No.483 マッチ並べ
ユーザー 👑 obakyan
提出日時 2022-11-13 23:33:30
言語 Lua
(LuaJit 2.1.1734355927)
結果
AC  
実行時間 4 ms / 2,000 ms
コード長 4,313 bytes
コンパイル時間 153 ms
コンパイル使用メモリ 6,816 KB
実行使用メモリ 5,376 KB
最終ジャッジ日時 2024-09-15 04:58:06
合計ジャッジ時間 1,995 ms
ジャッジサーバーID
(参考情報)
judge5 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 53
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

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 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]
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 n = io.read("*n")
local p1, p2 = {}, {}
local w = 111
for i = 1, n do
local r, c = io.read("*n", "*n")
p1[i] = (r - 1) * w + c
r, c = io.read("*n", "*n")
p2[i] = (r - 1) * w + c
end
local sccd = SCCD.new(2 * n)
for i = 1, n - 1 do
for j = i + 1, n do
if p1[i] == p1[j] then
sccd:addEdge(i, n + j)
sccd:addEdge(j, n + i)
elseif p1[i] == p2[j] then
sccd:addEdge(i, j)
sccd:addEdge(n + j, n + i)
elseif p2[i] == p1[j] then
sccd:addEdge(n + i, n + j)
sccd:addEdge(j, i)
elseif p2[i] == p2[j] then
sccd:addEdge(n + i, j)
sccd:addEdge(n + j, i)
end
end
end
sccd:categorize()
for i = 1, n do
if sccd.root[i] == sccd.root[n + i] then
print("NO") os.exit()
end
end
print("YES")
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0