细节巨多。

倍增即可。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
#include<cmath>
#include<cstdlib>
#define maxv 200500
#define maxn 100500
#define eps 1e-7
#define inf 0x7f7f7f7f7f7f7f7fLL
using namespace std;
long long n,m,h[maxn],x,y,aft[maxn][],anc[maxv][],dis1[maxv][],dis2[maxv][],hashed[maxn],pos[maxn];
long long ret1=,ret2=,ans;
struct pnt
{
long long ret,dot,rets;
}p[];
set <long long> s;
set <long long> ::iterator it;
double ans1=inf;
bool cmp(pnt x,pnt y)
{
if (x.ret!=y.ret) return x.ret<y.ret;
return x.rets>y.rets;
}
void divide()
{
for (long long i=;i<=n;i++) hashed[i]=h[i];
sort(hashed+,hashed+n+);
for (long long i=;i<=n;i++)
{
h[i]=lower_bound(hashed+,hashed+n+,h[i])-hashed;
pos[h[i]]=i;
}
}
long long ask(long long x,long long y)
{
ret1=;ret2=;
for (long long e=;e>=;e--)
{
if ((ret1+ret2+dis1[x][e]+dis2[x][e]<=y) && (anc[x][e]))
{
ret1+=dis1[x][e];ret2+=dis2[x][e];
x=anc[x][e];
}
}
}
void update(long long x)
{
if (!ret1) return;
if ((double)ret2/ret1<ans1) {ans1=(double)ret2/ret1;ans=x;}
else if (((double)ret2/ret1-ans1<=eps) && (hashed[h[ans]]<hashed[h[x]])) ans=x;
}
int main()
{
scanf("%lld",&n);
for (long long i=;i<=n;i++) scanf("%lld",&h[i]);
divide();
for (long long i=n;i>=;i--)
{
for (long long j=;j<=;j++) p[j].dot=p[j].ret=inf;
it=s.lower_bound(h[i]);
if (it!=s.end())
{
p[].ret=hashed[h[pos[*it]]];p[].dot=pos[*it];
if (++it!=s.end()) {p[].ret=hashed[h[pos[*it]]];p[].dot=pos[*it];}
it--;
}
if (it!=s.begin())
{
it--;
p[].ret=hashed[h[pos[*it]]];p[].dot=pos[*it];
if (it!=s.begin()) {it--;p[].ret=hashed[h[pos[*it]]];p[].dot=pos[*it];it++;}
}
for (int j=;j<=;j++)
{
if (p[j].ret!=inf)
{
p[j].rets=hashed[h[i]]-p[j].ret;
p[j].ret=abs(hashed[h[i]]-p[j].ret);
}
}
sort(p+,p+,cmp);
if (p[].ret!=inf) aft[i][]=p[].dot;
if (p[].ret!=inf) aft[i][]=p[].dot;
s.insert(h[i]);
}
for (long long i=;i<=n;i++)
{
anc[*i-][]=*aft[i][];dis1[*i-][]=abs(hashed[h[aft[i][]]]-hashed[h[i]]);dis2[*i-][]=;
anc[*i][]=max(*aft[i][]-,(long long));dis1[*i][]=;dis2[*i][]=abs(hashed[h[aft[i][]]]-hashed[h[i]]);
}
n*=;
for (long long e=;e<=;e++)
for (long long i=;i<=n;i++)
{
anc[i][e]=anc[anc[i][e-]][e-];
dis1[i][e]=dis1[i][e-]+dis1[anc[i][e-]][e-];
dis2[i][e]=dis2[i][e-]+dis2[anc[i][e-]][e-];
}
scanf("%lld",&x);
for (long long i=;i<=n;i+=)
{ask(i,x);update(i/);}
printf("%d\n",ans);
scanf("%lld",&m);
for (long long i=;i<=m;i++)
{
scanf("%lld%lld",&x,&y);
ask(*x,y);
printf("%lld %lld\n",ret2,ret1);
}
return ;
}

vijos 1780 开车旅行的更多相关文章

  1. [NOIP2012提高组]开车旅行

    题目:洛谷P1081.Vijos P1780.codevs1199. 题目大意:有n座海拔高度不相同的城市(编号1~n),两城市的距离就是两城市海拔之差.规定每次只能从编号小的城市走到编号大的城市. ...

  2. Luogu 1081 【NOIP2012】开车旅行 (链表,倍增)

    Luogu 1081 [NOIP2012]开车旅行 (链表,倍增) Description 小A 和小B决定利用假期外出旅行,他们将想去的城市从1到N 编号,且编号较小的城市在编号较大的城市的西边,已 ...

  3. CH5701 开车旅行

    题意 5701 开车旅行 0x50「动态规划」例题 描述 小A和小B决定利用假期外出旅行,他们将想去的城市从1到N编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 ...

  4. 2012Noip提高组Day1 T3 开车旅行

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

  5. Cogs 1264. [NOIP2012] 开车旅行(70分 暴力)

    1264. [NOIP2012] 开车旅行 ★★☆   输入文件:drive.in   输出文件:drive.out   简单对比时间限制:2 s   内存限制:128 MB [题目描述] 小A 和小 ...

  6. 开车旅行 【NOIP2012 D1T3】

    开车旅行 [NOIP2012 D1T3] 倍增 首先令\(a[i]\)表示从i出发最近的城市下标,\(b[i]\)表示从i出发第二近的城市下标 可以维护一个\(\text{set<pair< ...

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

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

  8. 开车旅行 2012年NOIP全国联赛提高组(倍增+set)

    开车旅行 2012年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond     题目描述 Description 小A 和小B决定利用 ...

  9. P1081 [NOIP2012]开车旅行[倍增]

    P1081 开车旅行    题面较为啰嗦.大概概括:一个数列,只能从一个点向后走,两种方案:A.走到和自己差的绝对值次小的点B.走到和自己差的绝对值最小点:花费为此差绝对值:若干询问从规定点向后最多花 ...

随机推荐

  1. javaWeb学习之运用myeclipse结合tomcat开发一些简单的jsp和service

    servlet是什么?     servlet是java服务器端编程.不同于我们之前写的一般的java应用程序,Servlet程序是运行在服务器上的,服务器有很多种.....现在只是用过 tomcat ...

  2. Asp.net 解析json

    Asp.net Json数据解析的一种思路 http://www.cnblogs.com/scy251147/p/3317366.html http://tools.wx6.org/json2csha ...

  3. ERP开发分享 1 数据库表设计

    这是我的ERP设计经验分享系列,今天讲的是数据库的表设计(1),主要阐述: 1.单字段的主键:2.使用int32作为主键类型:3.使用版本字段处理乐观锁定:4.生效字段标明是否允许“被使用”:5.锁定 ...

  4. PHP函数——parse_ini_file() 函数

    资料网址:http://www.w3school.com.cn/php/func_filesystem_parse_ini_file.asp 1.parse_ini_file() 函数解析一个配置文件 ...

  5. redhat enterprixe 5.0 samba 服务器 rpm 安装及配置

    Samba是著名的开源软件项目,在Linux/UNIX系统中实现了SMB/CIFS网络协议,因此使得跨平台的文件共享变得容易.在部署Windows.Linux/UNIX混合平台的企业环境时,使用Sam ...

  6. mysql启动错误

    1.启动时,显示ERROR tail localhost.localdomain.err 错误日志 2.新增目录,启动成功

  7. 判断是否是iOS8

    判断是否是iOS8 //判断是否是iOS8 if ([[UIDevice currentDevice].systemVersion doubleValue]>=8.0) { NSLog(@&qu ...

  8. bzoj 1877: [SDOI2009]晨跑

    #include<cstdio> #include<iostream> #include<cstring> #define M 6009 #define inf 2 ...

  9. Python中subprocess学习

    subprocess的目的就是启动一个新的进程并且与之通信. subprocess模块中只定义了一个类: Popen.可以使用Popen来创建进程,并与进程进行复杂的交互.它的构造函数如下: subp ...

  10. (转)iOS应用架构谈 view层的组织和调用方案

    前言 <iOS应用架构谈 开篇>出来之后,很多人来催我赶紧出第二篇.这一篇文章出得相当艰难,因为公司里的破事儿特别多,我自己又有点私事儿,以至于能用来写博客的时间不够充分. 现在好啦,第二 ...