比赛 2012Day1 评测结果 AAAAAAAAAAAAAATTTTTT
题目名称 开车旅行 最终得分 70
用户昵称 <蒟蒻>我要喝豆奶 运行时间 6.044 s
代码语言 C++ 内存使用 1.46 MiB
提交时间 2015-10-22 21:14:14
显示代码纯文本
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #define MAXN 100100UL
  5. #define inf 0x7fffffff
  6. #define eps 1e-6
  7. using namespace std;
  8. int n,h[MAXN],f[MAXN][2],ans1,ans2;
  9. inline int Fbs(int x){if(x<0)return (-x);return x;}
  10. inline double Dbs(int x){if(x<0)return (-1*x);return x;}
  11. inline void Get_Pos(void){
  12. for(int i=1;i<=n;i++){
  13. int minn=inf,ph=inf,pos=-1;
  14. for(int j=i+1;j<=n;j++)
  15. if(Fbs(h[j]-h[i])<minn||(Fbs(h[j]-h[i])==minn&&h[j]<ph))
  16. minn=Fbs(h[j]-h[i]),pos=j,ph=h[j];
  17. f[i][0]=pos;
  18. minn=inf,ph=inf,pos=-1;
  19. for(int j=i+1;j<=n;j++)
  20. if((f[i][0]!=j)&&(Fbs(h[j]-h[i])<minn||(Fbs(h[j]-h[i])==minn&&h[j]<ph)))
  21. minn=Fbs(h[j]-h[i]),pos=j,ph=h[j];
  22. f[i][1]=pos;
  23. }
  24. return ;
  25. }
  26. inline double Drive(int s,int x0){
  27. int Day=0,pos=s;
  28. double dista=0.0,distb=0.0;
  29. while(true){
  30. Day++;
  31. if((Day&1)==0){
  32. if(f[pos][0]==-1){break;}//can`t find more ways
  33. if(dista+distb+(double)Fbs(h[f[pos][0]]-h[pos])>x0)//Distance Limited
  34. break;
  35. distb+=(double)Fbs(h[f[pos][0]]-h[pos]);
  36. pos=f[pos][0];
  37. }else{
  38. if(f[pos][1]==-1){break;}
  39. if(dista+distb+(double)Fbs(h[f[pos][1]]-h[pos])>x0)
  40. break;
  41. dista+=(double)Fbs(h[f[pos][1]]-h[pos]);
  42. pos=f[pos][1];
  43. }
  44. }
  45. if(Dbs(distb)<eps){
  46. return 9999999.9;
  47. }else
  48. return (double)(dista/distb);
  49. }
  50. inline int Solve1(void){int x0,pos=0;
  51. scanf("%d",&x0);
  52. double now=9999999.9;
  53. for(int i=1;i<=n;i++){
  54. double temp=Drive(i,x0);
  55. if((temp<now)||(temp==now&&h[pos]<h[i]))
  56. now=temp,pos=i;
  57. }
  58. return (pos==0?2:pos);
  59. }
  60. inline void Drive_Again(int s,int x0){
  61. int Day=0,pos=s,dista=0,distb=0;
  62. while(true){
  63. Day++;
  64. if((Day&1)==0){//odd
  65. if(f[pos][0]==-1){break;}//can`t find more ways
  66. if(dista+distb+Fbs(h[f[pos][0]]-h[pos])>x0)//Distance Limited
  67. break;
  68. distb+=Fbs(h[f[pos][0]]-h[pos]);
  69. pos=f[pos][0];
  70. }else{//even
  71. if(f[pos][1]==-1){break;}
  72. if(dista+distb+Fbs(h[f[pos][1]]-h[pos])>x0)
  73. break;
  74. dista+=Fbs(h[f[pos][1]]-h[pos]);
  75. pos=f[pos][1];
  76. }
  77. }
  78. ans1=dista,ans2=distb;
  79. return ;
  80. }
  81. inline void Solve2(void){
  82. int T,s,x;
  83. scanf("%d",&T);
  84. while(T){
  85. T--;
  86. scanf("%d%d",&s,&x);
  87. Drive_Again(s,x);
  88. printf("%d %d\n",ans1,ans2);
  89. }return ;
  90. }
  91. inline void Debug(void){
  92. for(int i=1;i<=n;i++)
  93. printf("%d ",f[i][0]);
  94. printf("\n");
  95. for(int i=1;i<=n;i++)
  96. printf("%d ",f[i][1]);
  97. return ;
  98. }
  99. int main(){
  100. freopen("drive.in","r",stdin);
  101. freopen("drive.out","w",stdout);
  102. h[0]=inf;
  103. memset(f,-1,sizeof f);
  104. scanf("%d",&n);
  105. for(int i=1;i<=n;i++) scanf("%d",&h[i]);
  106. Get_Pos();//O(n^2)
  107. // Debug();
  108. printf("%d\n",Solve1());
  109. Solve2();
  110. return 0;
  111. }/*
  112. 10
  113. 4 5 6 1 2 3 7 8 9 10
  114. 7
  115. 10
  116. 1 7
  117. 2 7
  118. 3 7
  119. 4 7
  120. 5 7
  121. 6 7
  122. 7 7
  123. 8 7
  124. 9 7
  125. 10 7
  126. */