/*考场上写的暴力 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. 优化HTTP前端请求构建高性能ASP.NET站点

    HTTP请求的优化  在一个网页的请求过程中,其实整个页面的html结构(就是页面的那些html骨架)请求的时间是很短的,一般是占整个页面的请求时间的10%-20%.在页面加载的其余的时间实际上就是在 ...

  2. 使用Jquery解析Json

    利用原生JSON对象,将对象转为字符串 [javascript] view plaincopy var jsObj = {};   jsObj.testArray = [1,2,3,4,5];   j ...

  3. 使用gdb调试(转: http://www.cnblogs.com/luchen927/archive/2012/02/07/2339003.html)

    一般来说GDB主要调试的是C/C++的程序.要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中.使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点.如: > ...

  4. Ajax的load方法演示

    load方法的参数形式为: load(url,[data],[callback]); 其中url为请求HTML页面的URL地址.[data]表示发送至服务器的key/value数据.callback表 ...

  5. 用webclient.DownloadFile下载exe文件时大小为0

    用自己写的下载软件从服务器端下载文件,别的文件能下,但exe文件显示下载文件大小为0,连接超时,原因是服务上发布的下载文件夹的虚拟目录的属性有问题, 包含.exe 文件的虚拟目录已启用执行应用程序权限 ...

  6. WebAPI接口测试之matthewcv.WebApiTestClient

    WebAPI接口测试之matthewcv.WebApiTestClient matthewcv.WebApiTestClient 1.安装matthewcv.WebApiTestClient包 打开v ...

  7. 如何去除 ckeditor 上传图片后在原码中留下的 style="width: 100%;height:100px"之类的代码呢?

    ckeditor编辑器在上传图片的时候,会神奇的加上一段诡异的代码: 这导致上传的小图也是被拉伸到100%,我根本就没有定义它,找来找去也找不到element.style,原来这是在system.cs ...

  8. Ajax表单提交插件jquery form

    jQuery Form插件是一个优秀的Ajax表单插件,我们可以非常容易的使用它处理表单控件的值,清空和复位表单控件,附件上传,以及完成Ajax表单提交. jQuery Form有两个核心方法ajax ...

  9. JAVA与C#关于JSON序列化的比较

    JAVA CODE: import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java. ...

  10. Windows提供了两种将DLL映像到进程地址空间的方法(隐式和显式)

    调用DLL,首先需要将DLL文件映像到用户进程的地址空间中,然后才能进行函数调用,这个函数和进程内部一般函数的调用方法相同.Windows提供了两种将DLL映像到进程地址空间的方法: 1. 隐式的加载 ...