比赛 |
2012Day1 |
评测结果 |
AAAAAAAAAAAAAATTTTTT |
题目名称 |
开车旅行 |
最终得分 |
70 |
用户昵称 |
<蒟蒻>我要喝豆奶 |
运行时间 |
6.044 s |
代码语言 |
C++ |
内存使用 |
1.46 MiB |
提交时间 |
2015-10-22 21:14:14 |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#define MAXN 100100UL
#define inf 0x7fffffff
#define eps 1e-6
using namespace std;
int n,h[MAXN],f[MAXN][2],ans1,ans2;
inline int Fbs(int x){if(x<0)return (-x);return x;}
inline double Dbs(int x){if(x<0)return (-1*x);return x;}
inline void Get_Pos(void){
for(int i=1;i<=n;i++){
int minn=inf,ph=inf,pos=-1;
for(int j=i+1;j<=n;j++)
if(Fbs(h[j]-h[i])<minn||(Fbs(h[j]-h[i])==minn&&h[j]<ph))
minn=Fbs(h[j]-h[i]),pos=j,ph=h[j];
f[i][0]=pos;
minn=inf,ph=inf,pos=-1;
for(int j=i+1;j<=n;j++)
if((f[i][0]!=j)&&(Fbs(h[j]-h[i])<minn||(Fbs(h[j]-h[i])==minn&&h[j]<ph)))
minn=Fbs(h[j]-h[i]),pos=j,ph=h[j];
f[i][1]=pos;
}
return ;
}
inline double Drive(int s,int x0){
int Day=0,pos=s;
double dista=0.0,distb=0.0;
while(true){
Day++;
if((Day&1)==0){
if(f[pos][0]==-1){break;}//can`t find more ways
if(dista+distb+(double)Fbs(h[f[pos][0]]-h[pos])>x0)//Distance Limited
break;
distb+=(double)Fbs(h[f[pos][0]]-h[pos]);
pos=f[pos][0];
}else{
if(f[pos][1]==-1){break;}
if(dista+distb+(double)Fbs(h[f[pos][1]]-h[pos])>x0)
break;
dista+=(double)Fbs(h[f[pos][1]]-h[pos]);
pos=f[pos][1];
}
}
if(Dbs(distb)<eps){
return 9999999.9;
}else
return (double)(dista/distb);
}
inline int Solve1(void){int x0,pos=0;
scanf("%d",&x0);
double now=9999999.9;
for(int i=1;i<=n;i++){
double temp=Drive(i,x0);
if((temp<now)||(temp==now&&h[pos]<h[i]))
now=temp,pos=i;
}
return (pos==0?2:pos);
}
inline void Drive_Again(int s,int x0){
int Day=0,pos=s,dista=0,distb=0;
while(true){
Day++;
if((Day&1)==0){//odd
if(f[pos][0]==-1){break;}//can`t find more ways
if(dista+distb+Fbs(h[f[pos][0]]-h[pos])>x0)//Distance Limited
break;
distb+=Fbs(h[f[pos][0]]-h[pos]);
pos=f[pos][0];
}else{//even
if(f[pos][1]==-1){break;}
if(dista+distb+Fbs(h[f[pos][1]]-h[pos])>x0)
break;
dista+=Fbs(h[f[pos][1]]-h[pos]);
pos=f[pos][1];
}
}
ans1=dista,ans2=distb;
return ;
}
inline void Solve2(void){
int T,s,x;
scanf("%d",&T);
while(T){
T--;
scanf("%d%d",&s,&x);
Drive_Again(s,x);
printf("%d %d\n",ans1,ans2);
}return ;
}
inline void Debug(void){
for(int i=1;i<=n;i++)
printf("%d ",f[i][0]);
printf("\n");
for(int i=1;i<=n;i++)
printf("%d ",f[i][1]);
return ;
}
int main(){
freopen("drive.in","r",stdin);
freopen("drive.out","w",stdout);
h[0]=inf;
memset(f,-1,sizeof f);
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&h[i]);
Get_Pos();//O(n^2)
// Debug();
printf("%d\n",Solve1());
Solve2();
return 0;
}/*
10
4 5 6 1 2 3 7 8 9 10
7
10
1 7
2 7
3 7
4 7
5 7
6 7
7 7
8 7
9 7
10 7
*/