传送门

这题的暴力做法显然是照题意模拟,从每个点出发暴力跳.而这个暴跳显然是可以倍增优化的,就是预处理出从每个点,(一开始是A)往后跳\(2^k\)步,能到哪里,以及\(A\)和\(B\)的路程,然后暴力跳的时候倍增跳即可

// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define LL long long
#define il inline
#define re register
#define db double
#define eps (1e-5) using namespace std;
const int N=100000+10;
il LL rd()
{
LL x=0,w=1;char ch=0;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
int n,nn,nt[N][2],m,x;
LL jp[N][20][3],h[N];
struct node
{
int x;
node(){}
node(int nwx){x=nwx;}
bool operator < (const node &bb) const {return h[x]<h[bb.x];}
};
struct ppx
{
LL a,b,i;
ppx(){}
ppx(LL nwa,LL nwb,LL nwi){a=nwa,b=nwb,i=nwi;}
bool operator < (const ppx &bb) const {return h[i]!=h[bb.i]?(b==0&&bb.b>0?true:a*bb.b>b*bb.a):h[i]<h[bb.i];}
};
set<node> s;
priority_queue<ppx> q; int main()
{
n=rd();nn=log2(n);
for(int i=1;i<=n;i++) h[i]=rd();
h[n+1]=-2e9-7,h[n+2]=-2e9-8,h[n+3]=2e9+7,h[n+4]=2e9+8;
s.insert(node(n+1)),s.insert(node(n+2)),s.insert(node(n+3)),s.insert(node(n+4));
for(int i=n;i>=1;i--) //预处理每个点往后最近的和次近的位置
{
s.insert(node(i));
set<node>::iterator it=s.lower_bound(node(i));
int frt,nxt;
++it,nxt=node(*it).x,--it,--it,frt=node(*it).x,++it;
if(h[nxt]-h[i]<h[i]-h[frt])
{
nt[i][1]=nxt;
++it,++it,nxt=(*it).x;
nt[i][0]=h[nxt]-h[i]<h[i]-h[frt]?nxt:frt;
}
else
{
nt[i][1]=frt;
--it,--it,frt=(*it).x;
nt[i][0]=h[nxt]-h[i]<h[i]-h[frt]?nxt:frt;
}
}
for(int i=1;i<=n;i++)
jp[i][0][0]=abs(h[nt[i][0]]-h[i]),jp[i][0][2]=nt[i][0],jp[i][1][0]=abs(h[nt[i][0]]-h[i]),jp[i][1][1]=abs(h[nt[nt[i][0]][1]]-h[nt[i][0]]),jp[i][1][2]=nt[nt[i][0]][1];
for(int j=2;j<=nn;j++)
for(int i=1;i<=n;i++)
jp[i][j][0]=jp[i][j-1][0]+jp[jp[i][j-1][2]][j-1][0],jp[i][j][1]=jp[i][j-1][1]+jp[jp[i][j-1][2]][j-1][1],jp[i][j][2]=jp[jp[i][j-1][2]][j-1][2];
x=rd();
for(int i=1;i<=n;i++)
{
int nw=i,las=nn;
LL xx=x,nwa=0,nwb=0;
for(int j=nn;j>=0;j--)
if(jp[nw][j][2]<=n&&xx-(jp[nw][j][0]+jp[nw][j][1])>=0) las=j,xx-=jp[nw][j][0]+jp[nw][j][1],nwa+=jp[nw][j][0],nwb+=jp[nw][j][1],nw=jp[nw][j][2];
if(!las&&xx-abs(h[nt[nw][1]]-h[nw])>=0) nwb+=abs(h[nt[nw][1]]-h[nw]);
q.push(ppx(nwa,nwb,i));
}
printf("%lld\n",q.top().i);
m=rd();
while(m--)
{
int nw=rd(),las=nn;
LL xx=rd(),nwa=0,nwb=0;
for(int j=nn;j>=0;j--)
if(jp[nw][j][2]<=n&&xx-(jp[nw][j][0]+jp[nw][j][1])>=0) las=j,xx-=jp[nw][j][0]+jp[nw][j][1],nwa+=jp[nw][j][0],nwb+=jp[nw][j][1],nw=jp[nw][j][2];
if(!las&&xx-abs(h[nt[nw][1]]-h[nw])>=0) nwb+=abs(h[nt[nw][1]]-h[nw]);
printf("%lld %lld\n",nwa,nwb);
}
return 0; //很丑是不是(逃
}

luogu P1081 开车旅行的更多相关文章

  1. LUOGU P1081 开车旅行 (noip 2012)

    传送门 解题思路 这道题刚了一下午,主要就刚在set那里了.先写了一个暴力70分..之后优化预处理,看着大佬神犇们都用的什么双向链表之类的东西,本蒟蒻不会,又懒得手写平衡树,就拿了个set搞了搞,感觉 ...

  2. 洛谷 P1081 开车旅行(70)

    P1081 开车旅行 题目描述 小AA 和小BB 决定利用假期外出旅行,他们将想去的城市从 11到 NN 编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 ii的海 ...

  3. [NOIP2012] 提高组 洛谷P1081 开车旅行

    题目描述 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的 城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为 Hi,城市 ...

  4. P1081 开车旅行(Not Finish)

    https://www.luogu.org/problemnew/show/P1081

  5. noip2012 P1081 开车旅行

    小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为Hi,城市 i 和城市 j ...

  6. P1081 开车旅行

    题目描述 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的 城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为 Hi,城市 ...

  7. 洛谷 P1081 开车旅行 —— 倍增

    题目:https://www.luogu.org/problemnew/show/P1081 真是倍增好题! 预处理:f[i][j] 表示从 i 点开始走 2^j 次 AB (A,B各走一次)到达的点 ...

  8. NOIP 2012 洛谷P1081 开车旅行

    Description: 就是两个人开车,只能向东开.向东有n个城市,城市之间的距离为他们的高度差.A,B轮流开车,A喜欢到次近的城市,B喜欢到最近的城市.如果车子开到底了或者车子开的路程已经超过了限 ...

  9. 洛谷P1081 开车旅行70分

    https://www.luogu.org/problem/show?pid=1081 太遗憾了明明写出来了,却把最小值初始值弄小了,从第二个点开始就不可能对了.70分! #include<io ...

随机推荐

  1. sql 数据库(表空间),用户 相关命令

    随便转载,保留出处:http://www.cnblogs.com/aaron-agu/ 查看所有数据库 show databases; 创建新数据库 create datebase dbname:#登 ...

  2. Delphi中统一显示表格字段名的高效方法

    问题描述:在开发数据库程序时,我们经常要使用很多的表格显示组件DBGrid.当DBGrid显示某表格的数据时,其字段标题默认的就是后台数据库中的表格的字段名称.而为了数据库开发方便,后台数据库中的表格 ...

  3. JUC-Condition线程通信

    1,Codition接口描述了可能会与锁有关联的条件变量.这些变量在用法上与使用Object.wait访问的隐式监视器类似. 但提供了更强大的功能,需要指出的是,单个lock可能与多个conditio ...

  4. ubuntu 安装 postgresql

    安装环境: Ubuntu 10.04-desktop-i386 PostgreSQL 8.4 1. 安装PostgreSQL 输入如下命令 sudo apt-get install postgresq ...

  5. 部署AWStats分析系统

    介绍 AWStats是使用Prel语言开发的一款开源日志分析系统,它不仅可以用来分析Apache网站服务器的访问日志,也可以用来分析Samba.Vsftpd.IIS等服务的日志信息. AWStats软 ...

  6. pgm终

    这里罗列一些看完此书后遗留的问题: 常用 model 通过 BP/LBP 重新审视 inference 部分 Lauritzen algorithm/Lauritzen-Spiegelhalter a ...

  7. MT【210】四点共圆+角平分线

    (2018全国联赛解答最后一题)在平面直角坐标系$xOy$中,设$AB$是抛物线$y^2=4x$的过点$F(1,0)$的弦,$\Delta{AOB}$的外接圆交抛物线于点$P$(不同于点$A,O,B$ ...

  8. 洛谷P2516 [HAOI2010]最长公共子序列(LCS,最短路)

    洛谷题目传送门 一进来就看到一个多月前秒了此题的ysn和YCB%%% 最长公共子序列的\(O(n^2)\)的求解,Dalao们想必都很熟悉了吧!不过蒟蒻突然发现,用网格图貌似可以很轻松地理解这个东东? ...

  9. 洛谷UVA12995 Farey Sequence(欧拉函数,线性筛)

    洛谷题目传送门 分数其实就是一个幌子,实际上就是求互质数对的个数(除开一个特例\((1,1)\)).因为保证了\(a<b\),所以我们把要求的东西拆开看,不就是\(\sum_{i=2}^n\ph ...

  10. [hgoi#2019/2/17t1]million

    题目描述 面对格鲁的入侵,小黄人们要组建一支队伍,来抵御进攻,现在有编号为1 至n 的小黄人,任命编号为n 的队长,由其挑选队员,当然编号不是随便编的,每一个编号里都包含一个小黄人的个人信息,现在队长 ...