結果
問題 | No.1265 Balloon Survival |
ユーザー |
👑 |
提出日時 | 2020-11-17 23:09:00 |
言語 | Lua (LuaJit 2.1.1734355927) |
結果 |
TLE
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 6,446 bytes |
コンパイル時間 | 185 ms |
コンパイル使用メモリ | 7,072 KB |
実行使用メモリ | 60,160 KB |
最終ジャッジ日時 | 2024-07-23 08:32:03 |
合計ジャッジ時間 | 26,325 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 22 TLE * 10 |
ソースコード
local mma = math.maxlocal mfl, mce, mmi = math.floor, math.ceil, math.minlocal AvlTree = {}AvlTree.makenode = function(self, val, parent)local i = self.box[#self.box]if not i then i = #self.v + 1else table.remove(self.box)endself.v[i], self.p[i] = val, parentself.lc[i], self.rc[i], self.l[i], self.r[i] = 0, 0, 1, 1return iendAvlTree.create = function(self, lessthan, n)self.lessthan = lessthanself.root = 1self.box = {}for i = n + 1, 2, -1 do table.insert(self.box, i) end-- value, leftCount, rightCount, left, right, parentself.v, self.lc, self.rc, self.l, self.r, self.p = {}, {}, {}, {}, {}, {}for i = 1, n + 1 doself.v[i], self.p[i] = 0, 1self.lc[i], self.rc[i], self.l[i], self.r[i] = 0, 0, 1, 1endendAvlTree.clear = function(self)self.root = 1local np1 = #self.vfor i = np1, 2, -1 do self.box[np1 - i + 1] = i endendAvlTree.recalc = function(self, i)local kl, kr = self.l[i], self.r[i]if 1 < kl then self.lc[i] = 1 + mma(self.lc[kl], self.rc[kl])else self.lc[i] = 0endif 1 < kr then self.rc[i] = 1 + mma(self.lc[kr], self.rc[kr])else self.rc[i] = 0endendAvlTree.recalcAll = function(self, i)while 1 < i doself:recalc(i)i = self.p[i]endendAvlTree.rotR = function(self, parent)local granp, child = self.p[parent], self.l[parent]self.r[child], self.l[parent] = parent, self.r[child]self.p[child], self.p[parent] = granp, childself.p[self.l[parent]] = parentif 1 < granp thenif self.l[granp] == parent thenself.l[granp] = childelseself.r[granp] = childendelseself.root = childendendAvlTree.rotL = function(self, parent)local granp, child = self.p[parent], self.r[parent]self.l[child], self.r[parent] = parent, self.l[child]self.p[child], self.p[parent] = granp, childself.p[self.r[parent]] = parentif 1 < granp thenif self.r[granp] == parent thenself.r[granp] = childelseself.l[granp] = childendelseself.root = childendendAvlTree.rotLR = function(self, lparent, rparent)local sp, sl, sr = self.p, self.l, self.rlocal granp, d = sp[rparent], sr[lparent]sp[lparent], sr[lparent] = d, sl[d]sp[rparent], sl[rparent] = d, sr[d]sp[sl[d]], sp[sr[d]] = lparent, rparentsp[d], sl[d], sr[d] = granp, lparent, rparentif 1 < granp thenif sr[granp] == rparent then sr[granp] = delse sl[granp] = dendelse self.root = dendendAvlTree.rotRL = function(self, rparent, lparent)local sp, sl, sr = self.p, self.l, self.rlocal granp, d = sp[lparent], sl[rparent]sp[rparent], sl[rparent] = d, sr[d]sp[lparent], sr[lparent] = d, sl[d]sp[sr[d]], sp[sl[d]] = rparent, lparentsp[d], sr[d], sl[d] = granp, rparent, lparentif 1 < granp thenif sl[granp] == lparent then sl[granp] = delse sr[granp] = dendelse self.root = dendendAvlTree.empty = function(self) return self.root <= 1 endAvlTree.push = function(self, val)if self.root <= 1 then self.root = self:makenode(val, 1) return endlocal pos = self.rootwhile true doif self.lessthan(val, self.v[pos]) thenif 1 < self.l[pos] thenpos = self.l[pos]elseself.l[pos] = self:makenode(val, pos)pos = self.l[pos]breakendelseif 1 < self.r[pos] thenpos = self.r[pos]elseself.r[pos] = self:makenode(val, pos)pos = self.r[pos]breakendendendwhile 1 < pos dolocal child, parent = pos, self.p[pos]if parent <= 1 thenbreakendself:recalc(parent)local lcp_m_rcp = self.lc[parent] - self.rc[parent]if lcp_m_rcp % 2 ~= 0 then -- 1 or -1pos = parentelseif lcp_m_rcp == 2 thenif self.lc[child] - 1 == self.rc[child] thenself:rotR(parent)self:recalcAll(parent)elseself:rotLR(child, parent)self:recalc(child)self:recalcAll(parent)endbreakelseif lcp_m_rcp == -2 thenif self.rc[child] - 1 == self.lc[child] thenself:rotL(parent)self:recalcAll(parent)elseself:rotRL(child, parent)self:recalc(child)self:recalcAll(parent)endbreakelsebreakendendendAvlTree.rmsub = function(self, node)while 1 < node doself:recalc(node)if self.lc[node] == self.rc[node] thennode = self.p[node]elseif self.lc[node] + 1 == self.rc[node] thenself:recalcAll(self.p[node])breakelseif self.lc[self.r[node]] == self.rc[self.r[node]] thenself:rotL(node)self:recalcAll(node)breakelseif self.lc[self.r[node]] + 1 == self.rc[self.r[node]] thenlocal nr = self.r[node]self:rotL(node)self:recalc(node)node = nrelselocal nr = self.r[node]local nrl = self.l[nr]self:rotRL(nr, node)self:recalc(nr)self:recalc(node)node = nrlendendendendAvlTree.pop = function(self)local node = self.rootwhile 1 < self.l[node] donode = self.l[node]endlocal v = self.v[node]local kp = self.p[node]self.p[self.r[node]] = kpif 1 < kp thenself.l[kp] = self.r[node]self:rmsub(kp)elseself.root = self.r[node]endtable.insert(self.box, node)return vendAvlTree.new = function(lessthan, n)local obj = {}setmetatable(obj, {__index = AvlTree})obj:create(lessthan, n)return objendlocal n = io.read("*n")local x, y = {}, {}for i = 1, n dox[i], y[i] = io.read("*n", "*n")endif n == 1 then print(0) os.exit() endlocal function lensq(i, j)return (1LL * x[i] - x[j]) * (1LL * x[i] - x[j]) + (1LL * y[i] - y[j]) * (1LL * y[i] - y[j])endlocal e1, e2 = {}, {}local v = {}local alive = {}for i = 1, n do alive[i] = true endlocal c = 0local function lt(a, b)return v[a] < v[b]endlocal avl = AvlTree.new(lt, 1)for i = 1, n - 1 dofor j = i + 1, n doc = c + 1e1[c], e2[c] = i, jv[c] = lensq(i, j)avl:push(c)endendlocal ret = 0for i = 1, c dolocal idx = avl:pop()local z1, z2 = e1[idx], e2[idx]if z1 == 1 thenif alive[z2] thenret = ret + 1alive[z2] = falseendelseif alive[z1] and alive[z2] thenalive[z1], alive[z2] = false, falseendendendprint(ret)