封闭道路的题解呢?

考虑 A = B , C = D A=B,C=D A=B,C=D

只需要从 A A A开始每一步都跳最大的那个就好了!如果能跳到,说明 m a x [ B , C − 1 ] < m a x [ C , D ] max[B,C-1]< max[C,D] max[B,C−1]<max[C,D]

否则我们要么一步跳过去,要么中途跳到 B , C − 1 B,C-1 B,C−1某个数然后自闭掉

那么我们只需要每次跳小于 max ⁡ [ C , D ] \max[C,D] max[C,D]范围内最大的一个就好了

然后考虑 A ≠ B A\not = B A​=B

我们想法是选择一个最大的 P ∈ [ A , B ] P\in [A,B] P∈[A,B],然后发现如果 P > max ⁡ [ C , D ] P>\max [C,D] P>max[C,D]就彻底完蛋了…

于是发现我们如果有一个值大于 max ⁡ [ C , D ] \max[C,D] max[C,D],这个值前面的所有数都达不到目标点了…

然后我们相当于在这个区间的一个后缀中找到一个最大的 < max ⁡ [ C , D ] <\max[C,D] <max[C,D] 的数

线段树二分就好了!寻找这个区间最后一个大于等于x的值,然后再在这个值前面查询一个最大值的位置就好了

然后考虑 C ≠ D C\not =D C​=D

我们发现有效的值似乎只有 max ⁡ [ C , D ] \max [C,D] max[C,D]

但是考虑我们可能没有跳到最大值的时候就已经跳过去了…

于是发现我们还是要从 [ B , C − 1 ] [B,C-1] [B,C−1]这个区间入手,我们第一次跳到这个区间的最大值的时候就结束了!因为我们下一步一定可以跳进目标区间!

于是考虑我们现在完全将所有问题都规约到了 A = B , C = D A=B,C=D A=B,C=D

如何解决这个问题的最小步数?

首先,第一个数在树上倍增,找到第一个小于等于他的最大的数,满足这个数再向左边跳就跳到大于它的位置了,如果直接跳到那还挺好的

然后,第二个树在序列上倍增,相当于我们每个数只能向右侧跳,然后计算这样跳到它的最小步数

就做完了,复杂度一个 log ⁡ \log log

注意我们可能一步跳到 [ C , D ] [C,D] [C,D]的不只有 [ B , C − 1 ] [B,C-1] [B,C−1]的max,还有这个max值的前驱我们可能一步跳到他

特别的,你会发现一开始找到的数就能一步跳过去就直接选择那个数就好啦!

P7598 [APIO2021] 六边形领域

转换成网格之后一三象限距离为切比雪夫距离二四象限曼哈顿距离

然后转换方法为六个方向变成上下左右右上方左下方

并且一个正方形要变成两部分!就可以对应原来的六边形网格了

#include <bits/stdc++.h>
#include <vector>
#include <iostream>
#include <cstring>
using std::max;
using std::min;void init(int N, std::vector<int> H);
int minimum_jumps(int A, int B, int C, int D);
const int MAXN=3e5+7;
const int B=19;
int n;
int lg2[MAXN],f[B][MAXN],a[MAXN],g[B][MAXN],p[B][MAXN];
inline int qrym(int l,int r) {int tmp=lg2[r-l+1];return max(f[tmp][l],f[tmp][r-(1<<tmp)+1]);
}
int home[MAXN],nxt[MAXN],to[MAXN],ccnt,pre[MAXN],suf[MAXN];
inline void ct(int x,int y) {ccnt++;nxt[ccnt]=home[x];to[ccnt]=y;home[x]=ccnt;
}
inline void dfs(int u) {for(int i=1; i<B; ++i) {g[i][u]=g[i-1][g[i-1][u]];}for(int i=home[u]; i; i=nxt[i]) {dfs(to[i]);}return ;
}
inline void dfs2(int u) {for(int i=1; i<B; ++i)p[i][u]=p[i-1][p[i-1][u]];for(int i=home[u]; i; i=nxt[i])dfs2(to[i]);return ;
}
inline void init2() {pre[1]=0;for(int i=2; i<=n; ++i) {int l=1,r=i-1,mid,ans=0;while(l<=r) {mid=(l+r)>>1;if(qrym(mid,i-1)>=a[i]) {l=mid+1;ans=mid;} else {r=mid-1;}}pre[i]=ans;//前面第一个大于它的位置}a[n+1]=a[0]=0;suf[n]=n+1;for(int i=n-1; i>=1; --i) {int l=i+1,r=n,mid,ans=n+1;while(l<=r) {mid=(l+r)>>1;if(qrym(i+1,mid)>=a[i]) {r=mid-1;ans=mid;} else {l=mid+1;}}suf[i]=ans;}int mx=0;for(int i=1; i<=n; ++i) {if(a[i]>a[mx])mx=i;if(a[suf[i]]>a[pre[i]]) {g[0][i]=suf[i];ct(suf[i],i);} else if(a[suf[i]]<a[pre[i]]) {g[0][i]=pre[i];ct(pre[i],i);}}dfs(mx);ccnt=0;memset(home,0,sizeof(home));for(int i=1; i<=n; ++i) {p[0][i]=suf[i];ct(suf[i],i);}dfs2(n+1);return ;
}inline int getpos1(int L,int R,int p) {int mid,ans=0;while(L<=R) {mid=(L+R)>>1;if(qrym(mid,R)>=p) {ans=mid;L=mid+1;} else {R=mid-1;}}return ans;
}inline int getpos2(int L,int R,int p) {int mid,ans=0;while(L<=R) {mid=(L+R)>>1;if(qrym(L,mid)>=p) {ans=mid;R=mid-1;} else {L=mid+1;}}return ans;
}void init(int N, std::vector<int> H) {n=N;for(int i=2; i<=N; ++i) {lg2[i]=lg2[i>>1]+1;//我太菜了}for(int i=1; i<=N; ++i) {a[i]=f[0][i]=H[i-1];}for(int i=1; i<B; ++i) {for(int j=1; j<=N; ++j) {if(j+(1<<i)-1<=N) {f[i][j]=max(f[i-1][j],f[i-1][j+(1<<(i-1))]);}}}init2();return ;
}inline int calc(int x,int y) {int ret=0;for(int i=B-1; i>=0; --i) {if(a[g[i][x]] && a[g[i][x]]<=a[y]) {ret+=(1<<i);x=g[i][x];}//先跳大的qwq}if(x==y)return ret;for(int i=B-1; i>=0; --i) {if(a[p[i][x]] && a[p[i][x]]<=a[y]) {ret+=(1<<i);x=p[i][x];}//再跳小的qwq}return ret;
}int minimum_jumps(int A, int B, int C, int D) {++A,++B,++C,++D;if(B>=C)return 0;int Lim=qrym(B,C-1);//QAQ!int mx2=qrym(C,D);if(Lim>mx2)return -1;int l=A,r=B,mid,ans=A-1;//QAQwhile(l<=r) {mid=(l+r)>>1;if(qrym(mid,B)>=mx2) {//???ans=mid;l=mid+1;} else {r=mid-1;}}if(ans==B)return 1;//一次杀掉了int mx1=qrym(ans+1,B);if(mx1>Lim)return 1;int u=getpos1(ans+1,B,mx1);//直接geposint v=getpos2(B,C-1,Lim);//u->vint ans1=calc(u,v);int ans2=1e9;if(pre[v] && a[pre[v]]<mx2)ans2=calc(u,pre[v]);ans1=min(ans1,ans2)+1;return ans1;
}

P7599 [APIO2021] 雨林跳跃相关推荐

  1. P7599-[APIO2021]雨林跳跃【二分,倍增,ST表】

    正题 题目链接:https://www.luogu.com.cn/problem/P7599 题目大意 nnn棵树,在某棵树上时可以选择向左右两边第一棵比它高的树跳,现在qqq次询问从[A,B][A, ...

  2. 【倍增】【线段树】雨林跳跃(luogu 7599[APIO 2021 T2])

    正题 luogu 7599[APIO 2021 T2] 题目大意 给你一排树中每棵树的高度,每次跳跃可以跳到左/右边第一棵比该树高的树,问你从A-B中某棵树跳到C-D中的某棵树的最小步数(A⩽B< ...

  3. leetcode-45 跳跃游戏II

    给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组的最后一个位置. 示例: 输入: [2,3,1,1,4] 输 ...

  4. leetcode-55 跳跃游戏

    给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1,1,4] 输出: true ...

  5. 贪心:jump 游戏(获取最少跳跃的次数以及跳跃路径)

    一个数组存储了非负整型数据,数组中的第i个元素a[i],代表了可以从数组第i个 位置最多向前跳跃a[i]步;已知数组各元素的情况下,求是否可以从数组的第0个位置跳跃到数组的最后一个元素的位置,返回最少 ...

  6. 贪心:Jump Game 跳跃游戏

    一个数组存储了非负整型数据,数组中的第i个元素a[i],代表了可以从数组第i个 位置最多向前跳跃a[i]步;已知数组各元素的情况下,求是否可以从数组的第0个位置跳跃到数组的最后一个元素的位置,返回是t ...

  7. 用Python深入理解跳跃表原理及实现

    最近看 Redis 的实现原理,其中讲到 Redis 中的有序数据结构是通过跳跃表来进行实现的.第一次听说跳跃表的概念,感到比较新奇,所以查了不少资料.其中,网上有部分文章是按照如下方式描述跳跃表的: ...

  8. 刻意练习:LeetCode实战 -- Task28.跳跃游戏

    背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务.本期训练营采用分类别练习的模式,即选择了五个知识点(数组.链表.字符串.树.贪心算法),每个知 ...

  9. 跳跃游戏(判断是否可以跳到最后一个下标)

    给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 . 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个下标. 示例 1: 输入:nums = [2,3,1, ...

最新文章

  1. python open方法下file模块_python 文件操作
  2. 剑指 Offer 44. 数字序列中某一位的数字
  3. asp.net MVC控制器中返回JSON格式的数据时提示下载
  4. 开关量光端机产品特点及应用范围介绍
  5. (pytorch-深度学习)SE-ResNet的pytorch实现
  6. python中的多线程的优点_Python中多线程编程的优点是什么?
  7. Airtable无法上传附件/图片;点击附件上传没反应;不安全的地址怎么设置为受信任;解决方法亲测有效
  8. 网络推广运营主要做些什么
  9. 开启了ADB,就等于配了一把家门钥匙给别人!
  10. tensorflow之视频质量诊断
  11. 自制AMD CS5536关机代码和嵌入式
  12. 读[SBO高层大变动]一文有感
  13. 定制10kV变压器感应雷直击雷击变压器加避雷器atp-emtp模型
  14. hive-sql中平方和开根号函数
  15. pepe:从Pastebin收集邮件地址的信息
  16. 玩客云手动设置IP地址
  17. round在oracle中的作用,oracle中round函数的使用
  18. 【阿柟碎碎念】暑期集训篇
  19. win10 下Android 连接电脑本地MySQL数据库
  20. [vmware]另类解决vmware关闭win10死机或蓝屏问题

热门文章

  1. 用Python实现电脑与手机之间的文件快速传输
  2. more 可翻页查看(一页一页翻动)
  3. python中len用法_【python】python中len()怎么用-百度经验
  4. python操作三大主流数据库视频教程_Python操作三大主流数据库
  5. Word2016出现“此功能看似已中断 并需要修复”解决教程分享
  6. 学习python入门2
  7. 树莓派3b+指南(十八)高帧率opencv卡顿问题解决方案
  8. 动软代码生成器分页存储过程
  9. 网络安全事件应急演练各步骤参考模板
  10. 图解Java设计模式学习笔记——结构型模式(适配器模式、桥接模式、装饰者模式、组合模式、外观模式、享元模式、代理模式)