結果
問題 | No.416 旅行会社 |
ユーザー |
👑 |
提出日時 | 2021-08-29 00:04:12 |
言語 | Lua (LuaJit 2.1.1734355927) |
結果 |
AC
|
実行時間 | 650 ms / 4,000 ms |
コード長 | 2,736 bytes |
コンパイル時間 | 223 ms |
コンパイル使用メモリ | 6,820 KB |
実行使用メモリ | 48,640 KB |
最終ジャッジ日時 | 2024-12-14 21:08:50 |
合計ジャッジ時間 | 7,371 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 21 |
ソースコード
local mfl, mce = math.floor, math.ceil-- Partially Persistent Union-Findlocal PPUF = {}PPUF.create = function(self, n, inf)if not inf then inf = 1000000007 endself.inf = infself.parent = {}self.updated_time = {}self.rank = {}self.weight_change_time = {}self.weight = {}for i = 1, n doself.parent[i] = 0self.updated_time[i] = infself.rank[i] = 1self.weight_change_time[i] = {0}-- change weight if needself.weight[i] = {1}endself.edgecnt = 0endPPUF.getRoot = function(self, v, tm)if not tm then tm = self.edgecnt endwhile self.updated_time[v] <= tm dov = self.parent[v]endreturn vendPPUF.unite = function(self, v1, v2)local r1, r2 = self:getRoot(v1), self:getRoot(v2)local ec = self.edgecnt + 1self.edgecnt = ecif r1 == r2 then return endlocal rank = self.rankif rank[r2] < rank[r1] then r1, r2 = r2, r1 endself.parent[r1] = r2self.updated_time[r1] = ecif rank[r1] == rank[r2] thenrank[r2] = rank[r2] + 1endlocal weight = self.weightlocal new_w = weight[r2][#weight[r2]] + weight[r1][#weight[r1]]table.insert(self.weight_change_time[r2], ec)table.insert(weight[r2], new_w)endPPUF.getWeight = function(self, v, tm)if not tm then tm = self.edgecnt endlocal r = self:getRoot(v, tm)local wct = self.weight_change_time[r]if wct[#wct] <= tm then return self.weight[r][#wct] endlocal left, right = 1, #wctwhile 1 < right - left dolocal mid = mfl((left + right) / 2)if wct[mid] <= tm thenleft = midelseright = midendendreturn self.weight[r][left]endPPUF.new = function()local obj = {}setmetatable(obj, {__index = PPUF})return objendlocal n, m, q = io.read("*n", "*n", "*n")local edge = {}local parent = {}for i = 1, n doedge[i] = {}parent[i] = iendfor i = 1, m dolocal a, b = io.read("*n", "*n")edge[a][b] = trueendlocal cq, dq = {}, {}for i = 1, q dolocal c, d = io.read("*n", "*n")cq[i], dq[i] = c, dedge[c][d] = nilendlocal ppuf = PPUF.new()ppuf:create(n)local tm = 0for i = 1, n dofor j, _u in pairs(edge[i]) doppuf:unite(i, j)tm = tm + 1endendlocal basetime = tmfor iq = q, 1, -1 dolocal c, d = cq[iq], dq[iq]ppuf:unite(c, d)endlocal function solve(j, t)return ppuf:getRoot(1, t) == ppuf:getRoot(j, t)endlocal ret = {}for i = 2, n dolocal ng = 0local ok = basetime + q + 1while 1 < ok - ng dolocal mid = mfl((ok + ng) / 2)if solve(i, mid) thenok = midelseng = midendendif ok <= basetime thenprint(-1)elseif basetime + q < ok thenprint(0)elseok = ok - basetimeprint(q + 1 - ok)endend