细节巨多。

倍增即可。

#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. (11)lambda表达式用法

    * lambda 简述    lambda只是一个表达式,函数体比def简单很多    lambda的主体是一个表达式,而不是一个代码块.仅仅能在lambda表达式中封装有限的逻辑进去.    lam ...

  2. uva-----11292 The Dragon of Loowater

    Problem C: The Dragon of Loowater Once upon a time, in the Kingdom of Loowater, a minor nuisance tur ...

  3. SAP资产明细报表

    前两年别人写的,无自定义表字段...直接使用: *&---------------------------------------------------------------------* ...

  4. UML类图关系大全

    UML类图关系大全 1.关联 双向关联: C1-C2:指双方都知道对方的存在,都可以调用对方的公共属性和方法.在GOF的设计模式书上是这样描述的:虽然在分析阶段这种关系是适用的,但我们觉得它对于描述设 ...

  5. [工程备案]linux基本命令以及C和C++编程

    whereis 查看程序安装在了哪里 where 产看运行程序在哪里. libtool --mode=link  g++ test.cpp  -o test  libSegmentorForSim2T ...

  6. [转]BeginInvoke和EndInvoke方法浅析

    开发语言:C#3.0   IDE:Visual Studio 2008   一.C#线程概述   在操作系统中一个进程至少要包含一个线程,然后,在某些时候需要在同一个进程中同时执行多项任务,或是为了提 ...

  7. Xcode连接git@osc

    Xcode 已经集成了git,建立新项目时钩选使用git,然后按照下面步骤让Xcode和git@osc 建立连接. 第一步:成生SSH密钥 打开终端命令工具,输入命令:ssh-keygen -t rs ...

  8. HDU 1394 Minimum Inversion Number

    //============================================================================ // Name : B.cpp // Au ...

  9. php解密java的DES加密

    echo openssl_decrypt( $密文 ,"des-ecb" , $密钥 );

  10. validator

    http://rickharrison.github.io/validate.js/validate.js rules: 'required|callback_check_password' vali ...