開車旅行 【NOIP2012 D1T3】
阿新 • • 發佈:2018-09-28
復雜度 一個 下標 記錄 起點 math 第一個 eight lin
開車旅行 【NOIP2012 D1T3】
倍增
首先令\(a[i]\)表示從i出發最近的城市下標,\(b[i]\)表示從i出發第二近的城市下標
可以維護一個\(\text{set<pair<int,int> >}\)記錄城市海拔和城市編號,然後在set裏二分得到a和b
考慮\(f[i][j]\)表示從i出發,一共開2^j次車,開到那個城市
\(g[i][j]\)表示從i出發,開2^j次車的總距離
當j大於1的時候
\(f[i][j]=f[f[i][j-1]][j-1]\)
\(g[i][j]=g[i][j-1]+g[f[i][j-1]][j-1]\)
否則
\(f[i][1]=b[a[i]]\)
\(f[i][0]=a[i]\)
\(g[i][1]=g[i][0]+abs(height[f[i][1]]-height[f[i][0]])\)
\(g[i][0]=abs(height(f[i][0])-height(i))\)
然後維護\(a[i][j]\)表示從i出發,開2^j次車,A開的距離
\(b[i][j]\)表示從i出發,開2^j次車,B開的距離
那麽\(b[i][j]=g[i][j]-a[i][j]\)
而\(a[i][0]=f[i][0]\) \(a[i][1]=a[i][0]\)
當j>1時 \(a[i][j]=a[i][j-1]+a[f[i][j-1]][j-1]\)
然後第一個詢問就是枚舉起點+查詢
第二個詢問就是直接查詢
查詢\((S,X)\)返回一個\(\text{pair}\)表示A的距離和B的距離
我們首先在\(g\)上二分,得到走了多少步
然後把每一大步的a和b算出來
復雜度\(O(n \log n+m \log n)\)
開車旅行 【NOIP2012 D1T3】