首页 > 其他 > 详细

开车旅行 【NOIP2012 D1T3】

时间:2018-09-27 23:15:07      阅读:178      评论:0      收藏:0      [点我收藏+]

开车旅行 【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】

原文:https://www.cnblogs.com/wawawa8/p/9716153.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!