我是靠谱客的博主 老实手机,最近开发中收集的这篇文章主要介绍NOIp2012开车旅行,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

思路

我觉得难的是预处理,非常的麻烦;倍增比较好理解;
首先可以用线段树啊,双向链表啊,平衡树啊,二叉搜索树啊什么的(雾),我用的是set,倒序查找(因为只能走到比当前点序号要大的点),在set中查找当前的元素,然后找左边的两个,右边的两个(要注意判断是否有该元素),然后用nextA[i].,nextB[i],记录在点i,A和B分别要走到哪一点,lenA[i],lenB[i],记录点i,j走到nextA[i],nextB[i]所走的路程;处理完之后就可以循环一遍,更新g[i][0],f[i][0][0],f[i][0][1],(g[i][j]表示从点i出发,走了2^j轮(!!!注意是轮)后到达的点,f[i][j][0],表示点i出发经过2^j轮后到达的点,小A走的路径和,f[i][j][1]表示小B走的路径和);

那么g[i][0]=next2[next[1]],f[i][0][0]=lenA[i],f[i][0][1]=lenB[next1[i]];仔细理解下;

处理完之后就可以倍增了;
转移方程:
g[i][j]=g[g[i][j-1]][j-1];
f[i][j][0]=f[i][j-1][0]+f[g[i][j-1]][j-1][0];
f[i][j][1]=f[i][j-1][1]+f[g[i][j-1]][j-1][1];

之后就是处理询问了,从log2(n)开始枚举,如果能走就走,不能走继续下一个,要注意一点,枚举完之后要判断小A是不是能够再走一步,对于第一个询问,要注意精度的问题,把除法转化为乘法;

最后

以上就是老实手机为你收集整理的NOIp2012开车旅行的全部内容,希望文章能够帮你解决NOIp2012开车旅行所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(66)

评论列表共有 0 条评论

立即
投稿
返回
顶部