zoukankan      html  css  js  c++  java
  • 开车旅行 【NOIP2012 D1T3】

    开车旅行 【NOIP2012 D1T3】

    倍增

    首先令(a[i])表示从i出发最近的城市下标,(b[i])表示从i出发第二近的城市下标

    可以维护一个( ext{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))返回一个( ext{pair})表示A的距离和B的距离

    我们首先在(g)上二分,得到走了多少步

    然后把每一大步的a和b算出来

    复杂度(O(n log n+m log n))

  • 相关阅读:
    js push(),pop(),shift(),unshift()
    bootstrap fileinput 上传文件
    关于dataTable 生成JSON 树
    postgresql+ C#+ DHTMLX 学习汇总
    java_时间戳与Date_相互转化的实现代码
    SparkML之推荐算法ALS
    ALS部署Spark集群入坑记
    test
    迁移数据库mysql
    JVM运行机制
  • 原文地址:https://www.cnblogs.com/wawawa8/p/9716153.html
Copyright © 2011-2022 走看看