1. 程式人生 > >開車旅行 【NOIP2012 D1T3】

開車旅行 【NOIP2012 D1T3】

復雜度 一個 下標 記錄 起點 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】