比赛 20140414 评测结果 C
题目名称 登机 最终得分 0
用户昵称 GDFRWMY 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2014-04-14 11:09:30
显示代码纯文本
  1. #include<fstream>
  2. int MAXH=30;
  3. int s[300000],t[300000],a[300000],b[300000],ne[30][300000],lazy[30][300000],n,tol,head,ans,x;
  4.  
  5. using namespace std;
  6. ifstream fin("boarding.in");
  7. ofstream fout("boarding.out");
  8. void down(int j,int n) {
  9. if (j==0)
  10. return;
  11. bool flag=true;
  12. for(int x=n;x!=ne[j][n];x=ne[j-1][x]){
  13. if (!flag)
  14. a[x]-=lazy[j][n];
  15. flag=false;
  16. lazy[j-1][x]+=lazy[j][n];
  17. }
  18. lazy[j][n]=0;
  19. }
  20.  
  21. int geth(){
  22. for(int i=0;i<MAXH;i++){
  23. if (rand()%2)
  24. return i;
  25. }
  26. return MAXH;
  27. }
  28.  
  29.  
  30. bool better(int x, int y) {
  31. return b[x]-a[x]>=b[y]-a[y];
  32. }
  33.  
  34. int main(){
  35. fin>>n;
  36. for(int i=1;i<=n;i++)
  37. fin>>s[i]>>t[i];
  38. tol=1;
  39. for(int i=n;i>=1;i--){
  40. tol++;
  41. a[tol]=s[i];
  42. x=head;
  43. for(int j=MAXH;j>=0;--j){
  44. while (ne[j][x]&&a[ne[j][x]]<a[tol])
  45. x=ne[j][x];
  46. down(j,x);
  47. }
  48. b[tol]=b[x]-a[x]+s[i]+t[i];
  49. if (b[tol]>ans)
  50. ans=b[tol];
  51. x=head;
  52. a[x]--;
  53. for(int j=MAXH;j>=0;--j){
  54.  
  55. while (ne[j][x]&&a[ne[j][x]]<a[tol]){
  56. lazy[j][x]++;
  57. x=ne[j][x];
  58. a[x]--;
  59. }
  60. down(j,x);
  61.  
  62.  
  63. while (ne[j][x]&&better(tol,ne[j][x])){
  64. down(j,ne[j][x]);
  65. ne[j][x] = ne[j][ne[j][x]];
  66. }
  67.  
  68. int height=geth();
  69. if (height>=j) {
  70. ne[j][tol]=ne[j][x];
  71. ne[j][x]=tol;
  72. }
  73. }
  74. a[tol]--;
  75. }
  76. fout<<ans;
  77. return 0;
  78. }