結果
問題 | No.274 The Wall |
ユーザー |
👑 |
提出日時 | 2021-07-22 19:06:49 |
言語 | Lua (LuaJit 2.1.1734355927) |
結果 |
AC
|
実行時間 | 71 ms / 2,000 ms |
コード長 | 4,919 bytes |
コンパイル時間 | 37 ms |
コンパイル使用メモリ | 6,816 KB |
実行使用メモリ | 6,948 KB |
最終ジャッジ日時 | 2024-07-17 15:05:12 |
合計ジャッジ時間 | 1,443 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 22 |
ソースコード
local SCCD = {}SCCD.create = function(self, n)self.n = nself.asked, self.root = {}, {}self.edge, self.edge_asked = {}, {}self.invedge, self.invedge_asked = {}, {}for i = 1, n doself.asked[i] = falseself.root[i] = 0self.edge[i] = {}self.edge_asked[i] = 0self.invedge[i] = {}self.invedge_asked[i] = 0endself.edgeinfo = {}endSCCD.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)endSCCD.dfs = function(self, spos, dfs_way)local asked = self.askedlocal edge, edge_asked = self.edge, self.edge_askedlocal tasks = {spos}while 0 < #tasks dolocal src = tasks[#tasks]asked[src] = truetable.remove(tasks)if edge_asked[src] == #edge[src] thentable.insert(dfs_way, src)elsetable.insert(tasks, src)edge_asked[src] = edge_asked[src] + 1local dst = edge[src][edge_asked[src]]if not asked[dst] thentable.insert(tasks, dst)endendendendSCCD.invdfs = function(self, spos, rootid)local asked, root = self.asked, self.rootlocal invedge, invedge_asked = self.invedge, self.invedge_askedlocal tasks = {spos}while 0 < #tasks dolocal src = tasks[#tasks]root[src] = rootidtable.remove(tasks)while invedge_asked[src] < #invedge[src] doinvedge_asked[src] = invedge_asked[src] + 1local dst = invedge[src][invedge_asked[src]]if asked[dst] and root[dst] == 0 thentable.insert(tasks, src)table.insert(tasks, dst)breakendendendendSCCD.categorize = function(self)local asked, root = self.asked, self.rootfor src = 1, self.n doif not asked[src] thenlocal dfs_way = {}self:dfs(src, dfs_way)for i = #dfs_way, 1, -1 dolocal src = dfs_way[i]if root[src] == 0 thenself:invdfs(src, src)endendendendendSCCD.make_group_graph = function(self)self.gsize = {}self.gedge = {}self.gpcnt = {}self.glen = {}self.gmember = {}local gsize, gmember, glen = self.gsize, self.gmember, self.glenlocal gedge, gpcnt = self.gedge, self.gpcntlocal root = self.rootlocal edgeinfo = self.edgeinfofor i = 1, self.n dogsize[i] = 0gedge[i], gpcnt[i] = {}, 0glen[i] = 0gmember[i] = {}endfor i = 1, self.n dolocal r = root[i]gsize[r] = gsize[r] + 1table.insert(gmember[r], i)endfor i = 1, #edgeinfo, 2 dolocal a, b = edgeinfo[i], edgeinfo[i + 1]local ra, rb = root[a], root[b]if ra ~= rb thentable.insert(gedge[ra], rb)gpcnt[rb] = gpcnt[rb] + 1endendendSCCD.toposort = function(self)self:make_group_graph()local gsize, gedge, gpcnt = self.gsize, self.gedge, self.gpcntlocal topoary = {}self.topoary = topoarylocal topo_tasks = {}for i = 1, self.n doif 0 < gsize[i] and gpcnt[i] == 0 thentable.insert(topo_tasks, i)endendlocal topo_done = 0while topo_done < #topo_tasks dotopo_done = topo_done + 1local g = topo_tasks[topo_done]topoary[topo_done] = gfor i = 1, #gedge[g] dolocal dst = gedge[g][i]gpcnt[dst] = gpcnt[dst] - 1if gpcnt[dst] == 0 thentable.insert(topo_tasks, dst)endendendreturn topoaryendSCCD.new = function(n)local obj = {}setmetatable(obj, {__index = SCCD})obj:create(n)return objendlocal n, m = io.read("*n", "*n")local sccd = SCCD.new(2 * n)local l, r = {}, {}local linv, rinv = {}, {}for i = 1, n dol[i], r[i] = io.read("*n", "*n")linv[i] = m - 1 - r[i]rinv[i] = m - 1 - l[i]endlocal f1, f2, f3, f4 = true, true, true, truefor i = 1, n - 1 dofor j = i + 1, n dof1 = l[i] <= r[j] and l[j] <= r[i]f2 = l[i] <= rinv[j] and linv[j] <= r[i]f3 = linv[i] <= r[j] and l[j] <= rinv[i]f4 = linv[i] <= rinv[j] and linv[j] <= rinv[i]if f1 and not f2 then sccd:addEdge(i, n + j) endif f2 and not f1 then sccd:addEdge(i, j) endif f3 and not f4 then sccd:addEdge(n + i, n + j) endif f4 and not f3 then sccd:addEdge(n + i, j) endif f1 and not f3 then sccd:addEdge(j, n + i) endif f3 and not f1 then sccd:addEdge(j, i) endif f2 and not f4 then sccd:addEdge(n + j, n + i) endif f4 and not f2 then sccd:addEdge(n + j, i) endif f1 and f2 then sccd:addEdge(i, n + i) endif f3 and f4 then sccd:addEdge(n + i, i) endif f1 and f3 then sccd:addEdge(j, n + j) endif f2 and f4 then sccd:addEdge(n + j, j) endif f1 and f2 and f3 and f4 thenprint("NO") os.exit()endendend-- print(os.clock())sccd:categorize()sccd:toposort()-- print(os.clock())for i = 1, n doif sccd.root[i] == sccd.root[i + n] thenprint("NO") os.exit()endendprint("YES")