[心得] CF576C Mo's algorithm on non-DS problem

作者: rareone (拍玄)   2019-03-29 00:18:44
題幹:平面給 N 個點,輸出一條 circuit 走過所有點一次,而且長度小於等於 2.5e9
條件 (x, y) in [0, 1e6] X [0, 1e6], N <= 1e6
作法:
我一開始看到這題的時候真的用莫隊下去切,也沒有分析一下複雜度,就這樣踩到雷
我的莫隊是這樣 implement 的:
key = make_pair(x / SQRT, y)
sort points by key
分析一下為何錯誤:
SQRT = sqrt(1e6) = 1000
莫隊把 x 軸分成約 SQRT 塊,每一塊的 cost 右界移動最多是 1e6
** 塊跟塊之間的轉移 cost 是 1e6(右界指標要回來)**
光右界就能輕鬆造出 2e9
左界移動每次幅度大可以到 SQRT (外加 O(N) 均攤,倒不是很關鍵)
左屆總計也差不多 1e9 剛好吃 WA
如果交錯右屆可以磨掉 ** 之間的 cost 也就是:
key = make_pair(x / SQRT, x / SQRT % 2 ? y : -y)
sort point by key
偷看了一下測資,的確沒有 cost 是大於 2e9 ,很接近倒是有
作者: FRAXIS (喔喔)   2019-03-29 11:09:00
這是 Eucldean TSP 嗎?
作者: rareone (拍玄)   2019-03-29 13:10:00
Nope 是用莫隊想法
作者: oToToT (屁孩)   2019-03-30 07:55:00
前幾天也剛好看到這題XD

Links booklink

Contact Us: admin [ a t ] ucptt.com