传送门

分析

我们知道无论往左走还是往右走一定都是往不低于这个点的地方走

于是我们可以考虑用倍增来维护一个点向左和向右走$2^i$最远分别能走到哪里

我们可以先用单调栈求出直走一步的情况,之后再处理倍增数组

值得注意的是有可能一直往左走不是最优情况,而先向右再想左会使答案更优

于是le[x][i]=min(le[le[x][i-1]][i-1],le[ri[x][i-1]][i-1])

向右的情况同理

于是我们进一步考虑如何通过倍增数组得到答案、

我们先从左面往右走,只要走$2^i$不会超过右节点则就让它走这么多步

一直走到不能再走之后再从右往左走

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
const int LOG = ;
int a[],le[][LOG+],ri[][LOG+],st[],top;
int main(){
int n,m,i,j,k;
scanf("%d%d%d",&n,&k,&m);
for(i=;i<=n;i++)scanf("%d",&a[i]);
top=;
st[]=;
for(i=;i<=n;i++){
while(top&&a[st[top]]<a[i])top--;
le[i][]=st[top];
st[++top]=i;
}
top=;
st[]=n;
for(i=n;i>;i--){
while(top&&a[st[top]]<a[i])top--;
ri[i][]=st[top];
st[++top]=i;
}
for(i=;i<=LOG;i++)
for(j=;j<=n;j++){
le[j][i]=min(le[le[j][i-]][i-],le[ri[j][i-]][i-]);
ri[j][i]=max(ri[ri[j][i-]][i-],ri[le[j][i-]][i-]);
}
while(m--){
int x,y,Ans=,L,R,tl,tr;
scanf("%d%d",&x,&y);
if(x>y)swap(x,y);
L=R=x;
for(i=LOG;i>=;i--){
tl=min(le[L][i],le[R][i]);
tr=max(ri[L][i],ri[R][i]);
if(tr<y){
L=tl,R=tr;
Ans+=(<<i);
}
}
x=R;
L=R=y;
for(i=LOG;i>=;i--){
tl=min(le[L][i],le[R][i]);
tr=max(ri[L][i],ri[R][i]);
if(tl>x){
L=tl,R=tr;
Ans+=(<<i);
}
}
printf("%d\n",Ans);
}
return ;
}

loj2395 [JOISC 2017 Day 2]火车旅行的更多相关文章

  1. JOISC 2017 Day1 T3 烟花棒

    JOISC 2017 Day1 T3 烟花棒 题意: ​ 数轴上有\(N\)人在放烟花,一开始只有第\(K\)个人的烟花是点燃的,烟花燃烧的时间为\(T\)秒,求让所有人的烟花都可以点燃的速度的最小值 ...

  2. JOISC 2017

    Day1 「JOISC 2017 Day 1」开荒者 首先观察部分分发现分档很多,于是考虑一步步思考上来. 首先有一点关键观察(一): 风吹的顺序是无所谓的,令分别往东.西.南.北吹了 \(r, l, ...

  3. 「JOISC 2017 Day 3」幽深府邸

    题解: 和hnoi2018day2t1基本一样 我想了半小时想出了一个很麻烦的做法 写了之后发现假掉了 刚开始想的是 先预处理出每个门要打开至少要在左边的哪个点$L[]$,右边的哪个点$R[]$ 对每 ...

  4. JOISC 2017 自然公园

    吐槽 YMD的课件是真的毒,YYB的也很毒. 题目链接 LOJ sol 我是一个一个Subtask做的... Subtask 1 \(O(n^2)\)枚举每两个点有没有边即可. Subtask 2 链 ...

  5. loj 2392「JOISC 2017 Day 1」烟花棒

    loj 答案显然满足二分性,先二分一个速度\(v\) 然后显然所有没有点火的都会往中间点火的人方向走,并且如果两个人相遇不会马上点火,要等到火快熄灭的时候才点火,所以这两个人之后应该在一起行动.另外有 ...

  6. loj#2391 「JOISC 2017 Day 1」港口设施

    分析 https://yhx-12243.github.io/OI-transit/records/uoj356%3Bloj2391%3Bac2534.html 代码 #include<bits ...

  7. WC2019 题目集

    最近写的一些 WC2019 上讲的一些题.还是怕忘了,写点东西记录一下. LOJ2983 「WC2019」数树 题意 本题包含三个问题: 问题 0:已知两棵 \(n\) 个节点的树的形态(两棵树的节点 ...

  8. Java,该学什么?

    本人大学学的是生物技术专业,毕业后入坑Java. 最近有人问我是如何转行的,需要学一些什么.我在网上看到一篇帖子,觉得写得很全.如果是我来写,可能还写不了这么全的.在此分享给网友. 2019秋招几个月 ...

  9. 【转】设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成 ...

随机推荐

  1. 201621123014《Java程序设计》第八周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 答: 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 答: Arr ...

  2. EF中使用Linq的Lambda比较字符串格式日期大小

    在使用EF时,想要比较字符串类型的日期时,参考以下: SQL语句: 1)select * from TableName where StartTime > ‘2015-04-08‘ 2)sele ...

  3. 线程存储(Thread Specific Data)

    线程中特有的线程存储, Thread Specific Data .线程存储有什么用了?他是什么意思了? 大家都知道,在多线程程序中,所有线程共享程序中的变量.现在有一全局变量,所有线程都可以使用它, ...

  4. uuid 学习

    #include <vector> #include <iostream> #include <boost/uuid/uuid.hpp> #include < ...

  5. Android手机里的垃圾文件和文件夹清理

    SD卡中各个文件夹功能的最详尽分析SD卡用久了会有好多文件夹出现,大家看看都是干什么用~ 1..android_secure  是官方app2sd的产物,删了之后装到sd卡中的软件就无法使用了.2.. ...

  6. bzoj 3028 食物——生成函数

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3028 把式子写出来,化一化,变成 x / ((1-x)^4) ,变成几个 sigma 相乘的 ...

  7. MySQL 查询数据表里面时间字段为今天添加的计数

    一: 下面这条语句查出来的count值 .  查询类型ID(category_id)为18的,今天插入的数据数, created_on: 为数据表中一字段 datetime类型, 记录此条数据添加的时 ...

  8. Day1作业---登录接口及多级菜单

    #!/usr/bin/env python # -*- coding:utf-8 -*- # Author:Ma Qing data = { "山东" :{ "济南&qu ...

  9. List<T> JIT 分配策略

    参考 http://www.cnblogs.com/brookshi/p/5353021.html defaultCapacity意思是new List<T>时默认大小是4. _items ...

  10. PowerDesigner生成sql脚本时去掉双引号并把字段名设为大写

    Database菜单—Edit Current RDBMS 找到Script---sql—Format--- CaseSensitivityUsingQuote,把它设置为NO 这样再用sql pre ...