/*考场上写的暴力 40分钟70分*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define base 1000000000
#define maxn 100010
#define ll long long
using namespace std;
ll n,m,h[maxn],X,A[maxn],B[maxn],st,ans;
bool falg;
double mii=base;
ll init()
{
ll x=,f=;char s=getchar();
while(s<''||s>''){if(s=='-')f=-;s=getchar();}
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x*f;
}
ll Abs(ll a)
{
return a<?-a:a;
}
void Get_AB()
{
for(int i=;i<=n;i++)
{
ll mxx,mx,mxxh,mxh,kxx=,kx=;mxx=mx=0x7fffffff;
for(int j=i+;j<=n;j++)
{
ll C=Abs(h[i]-h[j]);
if(C<mxx||(C==mxx&&h[j]<mxxh))
mx=mxx,mxx=C,mxh=mxxh,mxxh=h[j],kx=kxx,kxx=j;
else if((C==mxx&&h[j]>=mxxh)||C<mx||(C==mx&&h[j]<mxh))
mx=C,mxh=h[j],kx=j;
}
A[i]=kx;B[i]=kxx;
}
}
void Dfs(ll now,ll who,ll As,ll Bs,ll limit,ll S)
{
if(falg)return;ll s1=,s2=;double tmp;
if(!who)s1=As+Abs(h[now]-h[A[now]]),S+=Abs(h[now]-h[A[now]]);
if(who)s2=Bs+Abs(h[now]-h[B[now]]),S+=Abs(h[now]-h[B[now]]);
if(S>limit||(!who&&A[now]==)||(who&&B[now]==))
{
if(!Bs)tmp=base;
else tmp=double(As)/double(Bs);
if(tmp<mii||(tmp==mii&&h[st]>h[ans]))
ans=st,mii=tmp;
falg=;return ;
}
if(!who&&s1<=limit)Dfs(A[now],!who,s1,Bs,limit,S);if(falg)return;
if(who&&s2<=limit)Dfs(B[now],!who,As,s2,limit,S);if(falg)return;
if(!Bs)tmp=base;
else tmp=double(As)/double(Bs);
if(tmp<mii||(tmp==mii&&h[st]>h[ans]))
ans=st,mii=tmp;
falg=;return ;
}
void dfs(ll now,ll who,ll As,ll Bs,ll limit,ll S)
{
if(falg)return;ll s1=,s2=;
if(!who)s1=As+Abs(h[now]-h[A[now]]),S+=Abs(h[now]-h[A[now]]);
if(who)s2=Bs+Abs(h[now]-h[B[now]]),S+=Abs(h[now]-h[B[now]]);
if(S>limit||(!who&&A[now]==)||(who&&B[now]==))
{
cout<<As<<" "<<Bs<<endl;
falg=;return;
}
if(!who&&s1<=limit)dfs(A[now],!who,s1,Bs,limit,S);if(falg)return;
if(who&&s2<=limit)dfs(B[now],!who,As,s2,limit,S);if(falg)return;
cout<<As<<" "<<Bs<<endl;
falg=;return;
}
int main()
{
n=init();int x,s;
for(int i=;i<=n;i++)
{
x=init();h[i]=x+base;
}
Get_AB();X=init();
for(int i=;i<=n;i++)
falg=,st=i,Dfs(i,,,,X,);
cout<<ans<<endl;
m=init();
for(int i=;i<=m;i++)
{
s=init();x=init();
falg=;dfs(s,,,,x,);
}
return ;
}
/*
暴力的复杂度是n*n的
首先预处理每个点的最短次短距离就Tle了
这里我们借助set O n 的解决这个问题
然后对于每个询问 利用倍增 logn的实现就不超时了
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
#include<cmath>
#define base 100000000000//大大大大大
#define maxn 100010
#define ll long long
using namespace std;
ll n,m,X,A[maxn],B[maxn],As[maxn],Bs[maxn],ans;
ll d[maxn][],f[maxn][][];
double mii=base;
struct point
{
ll o,hi;
bool operator < (const point & a) const
{
return hi<a.hi;
}
}p[maxn];
set<point>s;
set<point>::iterator pi;
ll init()
{
ll x=,f=;char s=getchar();
while(s<''||s>''){if(s=='-')f=-;s=getchar();}
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x*f;
}
ll abs(ll a)
{
return a<?-a:a;
}
void Add(point x,point y)
{
if(!B[x.o])
{
B[x.o]=y.o;
Bs[x.o]=abs(x.hi-y.hi);
}
else if(abs(x.hi-y.hi)<Bs[x.o]||(abs(x.hi-y.hi)==Bs[x.o]&&y.hi<p[B[x.o]].hi))
{
A[x.o]=B[x.o];
As[x.o]=Bs[x.o];
B[x.o]=y.o;
Bs[x.o]=abs(x.hi-y.hi);
}
else if(abs(x.hi-y.hi)<As[x.o]||(abs(x.hi-y.hi)==As[x.o]&&y.hi<p[A[x.o]].hi))
{
A[x.o]=y.o;
As[x.o]=abs(x.hi-y.hi);
}
else if(!A[x.o])
{
A[x.o]=y.o;
As[x.o]=abs(x.hi-y.hi);
}
return;
}
void Get_AB()
{
for(int i=n;i>=;i--)
{
s.insert(p[i]);
pi=s.find(p[i]);
if(pi!=s.begin())
{
pi--;Add(p[i],*pi);
if(pi!=s.begin())
{
pi--;Add(p[i],*pi);pi++;
}
pi++;
}
if((++pi)!=s.end())
{
Add(p[i],*pi);
if((++pi)!=s.end())
Add(p[i],*pi);
pi--;
}
pi--;
}
}
void Query(int st,ll limit,ll & sa,ll & sb)
{
for(int i=;i>=;i--)
if(f[st][i][]+f[st][i][]<=limit&&d[st][i])
{
sa+=f[st][i][];sb+=f[st][i][];
limit-=(f[st][i][]+f[st][i][]);st=d[st][i];
}
if(A[st]&&As[st]<=limit)
sa+=As[st];
}
int main()
{
n=init();
for(int i=;i<=n;i++)
{
p[i].hi=init();p[i].o=i;
}
Get_AB();
for(int i=;i<=n;i++)
{
d[i][]=B[A[i]];
f[i][][]=As[i];
f[i][][]=Bs[A[i]];
}
for(int j=;j<=;j++)
for(int i=;i<=n;i++)
{
d[i][j]=d[d[i][j-]][j-];
f[i][j][]=f[i][j-][]+f[d[i][j-]][j-][];
f[i][j][]=f[i][j-][]+f[d[i][j-]][j-][];
}
X=init();
for(int i=;i<=n;i++)
{
ll sa=,sb=;double tmp;
Query(i,X,sa,sb);
if(!sb)tmp=base;
else tmp=double(sa)/double(sb);
if(tmp<mii||(tmp==mii&&p[i].hi>p[ans].hi))
ans=i,mii=tmp;
}
cout<<ans<<endl;
m=init();int st;
for(int i=;i<=m;i++)
{
st=init();X=init();
ll sa=,sb=;
Query(st,X,sa,sb);
cout<<sa<<" "<<sb<<endl;
}
return ;
}

noip 2012 开车旅行的更多相关文章

  1. 【NOIP 2012 开车旅行】***

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

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

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

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

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

  4. P1081 开车旅行

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

  5. [NOIP2012T3]开车旅行

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

  6. NOIP 2012 Day1

    tags: NOIP 模拟 倍增 高精 Python categories: 信息学竞赛 总结 Luogu P1079 Vigenère 密码 Solution 表示并不是很懂其他人发的题解. 我是这 ...

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

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

  8. NOIp 2012 #2 借教室 Label:区间修改线段树

    题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然 ...

  9. NOIp 2012 #1 Vigenère 密码 Label:模拟

    题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密 码.Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南 ...

随机推荐

  1. 利用js加载本地图片预览功能

    直接上代码: 经测试,除safari6包括6以下不支持,其他均可正常显示. 原因:safari6不支持filereader,同时不能使用IE滤镜导致失效. fix: 可以利用canvas,解决safa ...

  2. c++builder向c#开发的webservice传递非数字参数

    一.引用WebService地址 BCB6.0环境下,File-New-Other-WebService-WSDL Importer.然后手动写完整地址.如:“http://192.168.1.3:1 ...

  3. Ajax.BeginForm 防止跳转到新页面

    @using (Ajax.BeginForm("ChangeCompanyId", "navigation", new { area = "confi ...

  4. PHP mysql 删除表中所有数据只保留一条

    DELETE FROM `logs` WHERE wangzhi='www.juhutang.com' and id<>101072; 上面这段代码的意思为 删除表logs中 所有字段wa ...

  5. IOS快速开发之常量定义

    ---恢复内容开始--- 在IOS开发中,有一些方法常常需要用的,但是有很长的方法名,这造成了代码长,写起来累,我们可以通过宏定义了解决这些问题 比如说在代码布局的时候会遇上这样的问题,我们要获取上面 ...

  6. Hybrid----优秀开源代码解读之JS与iOS Native Code互调的优雅实现方案-备

    本篇为大家介绍一个优秀的开源小项目:WebViewJavascriptBridge. 它优雅地实现了在使用UIWebView时JS与ios 的ObjC nativecode之间的互调,支持消息发送.接 ...

  7. mongodb教程二

    MongoDB 创建数据库: MongoDB 创建数据库的语法格式如下: use DATABASE_NAME 如果数据库不存在,则创建数据库,否则切换到指定数据库. 如果你想查看所有数据库,可以使用  ...

  8. 使用putty登陆cygwin出现server unexpectedly ...error.解决方案

    将cygwin安装目录下/etc/passwd中的passwd文件中user:unused:32707:10513:U-CYOU-INC\user,S-1-5-21-2645613570-259884 ...

  9. 《Ruby语言入门教程v1.0》学习笔记-02

    9.18 第四章 一切都是对象 这个章节的例子都举得很浅显易懂,而且作者的语言= =噗,委实生动有趣啊是~~ 4.1  两种思维方式 初期的编程思想是:以“如何做”为指导来编写代码.这时期的编程语言叫 ...

  10. HDOJ 1285 确定比赛名次(拓扑排序)

    Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委 ...