P1081 开车旅行[倍增](毒瘤题)】的更多相关文章

题目:https://www.luogu.org/problemnew/show/P1081 真是倍增好题! 预处理:f[i][j] 表示从 i 点开始走 2^j 次 AB (A,B各走一次)到达的点:   sta[i][j] 表示从 i 点开始走 2^j 次 AB 后 A 走过的总路程:stb 为 B 的: 首先要找到 2^0 位置上的,也就是右边最近的和次近的点: 先把点按海拔排序,那么最近点和次近点一定在 i-2 , i-1 , i+1 , i+2 这四个位置: 又不能找到 i 之前的点,…
其实就是个大模拟. 首先,根据题意,小A和小B从任意一个城市开始走,无论\(X\)如何,其路径是一定唯一的. 显然对于两问都可以想出一个\(O(n^2)\)的暴力,即直接一步一步地向右走. 首先,我们当然需要知道A,B在每个城市的下一步如何走,记\(nexta(i),nextb(i)\)为A,B在\(i\)处时,下一步走到的城市编号. 考虑如何高效(复杂度小于等于\(O(nlogn)\))维护两个\(next\). 显然不能直接维护每个城市与其后面的城市的差值,再好的数据结构也会到\(O(n^2…
题意 题目链接 Sol 咕了一年的题解.. 并不算是很难,只是代码有点毒瘤 \(f[i][j]\)表示从\(i\)号节点出发走了\(2^j\)轮后总的距离 \(da[i][j]\)同理表示\(a\)的距离,\(db[i][j]\)与\(da\)同理 倍增优化一下 注意最后\(a\)可能还会走一次 #include<bits/stdc++.h> #define Pair pair<int, int> #define MP make_pair #define fi first #def…
P1081 开车旅行    题面较为啰嗦.大概概括:一个数列,只能从一个点向后走,两种方案:A.走到和自己差的绝对值次小的点B.走到和自己差的绝对值最小点:花费为此差绝对值:若干询问从规定点向后最多花费$X$,且以移动方式A开始每走一次切换一次方式.求以A.B方式各花费多少. 不看题解切紫题一遍过了,兴奋~然而连想带写花了四小时左右,真要在noip考场上怕不是要凉...我太菜了QwQ 先看第一问,找比值最小点,实际上就是拆成$N$个询问,扔到第二问的询问里面做掉的说.所以主要看对于询问点怎么向后…
P1081 开车旅行 题目描述 小AA 和小BB 决定利用假期外出旅行,他们将想去的城市从 11到 NN 编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 ii的海拔高度为H_iHi​,城市 ii和城市jj之间的距离 d_[i,j]d[​i,j]恰好是这两个城市海拔高度之差的绝对值,即d_[i,j]=|H_i-H_j|d[​i,j]=∣Hi​−Hj​∣. 旅行过程中,小 AA和小 BB 轮流开车,第一天小 AA 开车,之后每天轮换一次.他们计划选择一个城市 S…
传送门 思路简单码量超凡? 感觉看完题大家应该都知道是倍增sbsbsb题了吧. 首先预处理出从每个点出发如果是AAA走到哪个点,如果是BBB走到哪个点. 然后利用刚刚预处理出的信息再预处理从每个点出发AAA走2i2^i2i次的距离,BBB走2i2^i2i次的距离,A,BA,BA,B走2i2^i2i轮之后到了哪个点. 剩下的询问就跑倍增就行了. 代码: #include<bits/stdc++.h> #include<tr1/unordered_map> #define fi fir…
倍增数组的20和N写反了反复WAWAWA-- 注意到a和b在每个点上出发都会到一个指定的点,所以这样构成了两棵以n点为根的树 假设我们建出了这两棵树,对于第一问就可以枚举起点然后倍增的找出ab路径长度的比值,第二问同理,这里倍增的时候注意是先跳a再跳b,所以同一个点b的倍增数组要从a在这个点的的父亲开始,然后位置倍增数组也是这样,这样位置倍增相当于跳完a再跳b 然后这个树怎么建呢,开一个双向链表,表内按h排升序,因为一个点的最大次大值一定在比它小的值中最大的两个和比它大的值中最小的两个之中,所以…
题目描述 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的 城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为 Hi,城市 i 和城市 j 之间的距离 d[i,j]恰好是这两个城市海拔高度之差的绝对值,即 d[i,j] = |Hi− Hj|. 旅行过程中,小 A 和小 B 轮流开车,第一天小 A 开车,之后每天轮换一次.他们计划 选择一个城市 S 作为起点,一直向东行驶,并且最多行驶 X 公里就结束旅行.小 A 和小 B…
题目描述 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的 城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为 Hi,城市 i 和城市 j 之间的距离 d[i,j]恰好是这两个城市海拔高度之差的绝对值,即 d[i,j] = |Hi− Hj|. 旅行过程中,小 A 和小 B 轮流开车,第一天小 A 开车,之后每天轮换一次.他们计划 选择一个城市 S 作为起点,一直向东行驶,并且最多行驶 X 公里就结束旅行.小 A 和小 B…
题目描述 有\(n\)个城市,第\(i\)个城市的海拔为\(h_i\)且这\(n\)个城市的海拔互不相同.编号比较大的城市在东边.两个城市\(i,j\)之间的距离为\(|h_i-h_j|\) 小A和小B要开车去旅行.小A先开,他们会轮流开车.小A会把车开到第二近的城市,小B会把车开到最近的城市.如果当前城市到两个城市的距离相同,则认为海拔低的城市比较近.他们只会把车往东边开(即编号大的那边). 小A会先问你对于一个给定的\(x=x_0\),从哪一个城市出发,小A开车行驶的路程总数与小B行驶的路程…