Advertisement
Dorijanko

IOI 16 shortcut

Jun 19th, 2019
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.06 KB | None | 0 0
  1. #include "shortcut.h"
  2. #define ll long long
  3. #include <bits/stdc++.h>
  4. using namespace std;
  5. const int MOD=1000000007;
  6. #define x first
  7. const ll LLINF=1ll<<60;
  8. #define y second
  9. #define pb push_back
  10. #define pii pair<int,int>
  11. #define vi vector<int>
  12. #define vl vector<ll>
  13. const char en='\n';
  14.  
  15. inline ll dist(const vl&pr,const vi&d,int i,int j,bool x,bool y)
  16. {
  17. return pr[j]-pr[i]+x*d[i]*((i!=j)||!y)+y*d[j];
  18. }
  19.  
  20. bool debug=0;
  21. int ouL=1,ouR=8;
  22.  
  23. ll find_shortcut(int n,vi h,vi d,int c)
  24. {
  25. if (!debug) ouL=-1;
  26. assert(n<=500);
  27. vl prs;
  28. prs.pb(0);
  29. for (int i=0;i<n-1;++i) prs.pb(prs.back()+h[i]);
  30. vl pr=prs;
  31. vl prs2;
  32. for (int i=0;i<n;++i) prs2.pb(prs[i]*2);
  33. ll ans=LLINF;
  34. for (int l=0;l<n;++l) for (int r=l+1;r<n;++r)
  35. {
  36. ll ma=0,ma2=d[0];
  37. int p=0;
  38. for (int i=1;i<l;++i)
  39. {
  40. ma=max(ma,dist(prs,d,p,i,1,1));
  41. if (-pr[i]+d[i]>ma2) ma2=-pr[i]+d[i],p=i;
  42. }
  43. int p1=p;
  44. ll C=-c-pr[r]+pr[l];
  45. int pos=l;
  46. queue<pair<int,ll>> q;
  47. deque<pair<int,ll>> s;
  48. int p2=l;
  49. ll mao=pr[p2]+d[p2];
  50. for (int i=l;i<=r;++i)
  51. {
  52. ll distL=dist(prs,d,i,r,1,0)+c;
  53. if (i!=l)
  54. {
  55. q.push({i,d[i]-pr[i]});
  56. while (s.size() && s.back().y<d[i]-pr[i]) s.pop_back();
  57. s.push_back({i,d[i]-pr[i]});
  58. }
  59. if (distL>=dist(prs,d,l,i,0,1))
  60. {
  61. if (l==ouL && r==ouR) cout<<"sve prije "<<pos<<' '<<i<<' '<<l<<' '<<r<<' '<<ma<<endl;
  62. ma=max(ma,dist(prs,d,p,i,1,1));
  63. if (l==ouL && r==ouR) cout<<"sve kasnije "<<pos<<' '<<i<<' '<<l<<' '<<r<<' '<<ma<<endl;
  64. }
  65. else
  66. {
  67. while (prs2[pos+1]<prs2[i]+C)
  68. {
  69. ++pos;
  70. if (pr[pos]+d[pos]>mao) mao=pr[pos]+d[pos],p2=pos;
  71. auto m=q.front();
  72. q.pop();
  73. if (s.front()==m) s.pop_front();
  74. }
  75. if (l==ouL && r==ouR) cout<<"podjelaL "<<pos<<' '<<i<<' '<<l<<' '<<r<<' '<<ma<<' '<<distL<<' '<<p2<<' '<<s.front().x<<' '<<s.front().y<<' '<<mao<<endl;
  76. ma=max(ma,distL+dist(prs,d,p1,l,1,0));
  77. ma=max(ma,distL+dist(prs,d,l,p2,0,1));
  78. ma=max(ma,dist(prs,d,s.front().x,i,1,1));
  79. if (l==ouL && r==ouR) cout<<"nakon podjeleL "<<pos<<' '<<i<<' '<<l<<' '<<r<<' '<<ma<<' '<<distL<<' '<<p2<<' '<<s.front().x<<' '<<s.front().y<<' '<<mao<<endl;
  80. }
  81. if (-pr[i]+d[i]>ma2) ma2=-pr[i]+d[i],p=i;
  82. }
  83. int la=l;
  84. auto a=upper_bound(prs2.begin(),prs2.end(),prs[l]+prs[r]-c);
  85. int x=a-prs2.begin();
  86. ll ma3=-LLINF,p3=-1,ma4=-LLINF,p4=-1,ma5=-LLINF,p5=-1;
  87. for (int i=0;i<l;++i) if (-pr[i]+d[i]>ma3) ma3=-pr[i]+d[i],p3=i;
  88. for (int i=l;i<x;++i) if (pr[i]+d[i]>ma4) ma4=pr[i]+d[i],p4=i;
  89. for (int i=max(l,x);i<=r;++i) if (-pr[i]+d[i]>ma5) ma5=-pr[i]+d[i],p5=i;
  90. if (l==ouL && r==ouR) cout<<l<<' '<<r<<' '<<x<<' '<<p3<<' '<<p4<<' '<<p5<<' '<<ma<<endl;
  91. for (int i=r+1;i<n;++i)
  92. {
  93. ll distL=dist(prs,d,r,i,0,1)+c;
  94. if (p3!=-1)
  95. {
  96. ma=max(ma,min(distL+dist(prs,d,p3,l,1,0),dist(prs,d,p3,i,1,1)));
  97. }
  98. if (p4!=-1) ma=max(ma,distL+dist(prs,d,l,p4,0,1));
  99. if (p5!=-1) ma=max(ma,dist(prs,d,p5,i,1,1));
  100. if (-pr[i]+d[i]>ma5) ma5=-pr[i]+d[i],p5=i;
  101. }
  102. if (debug) cout<<l<<' '<<r<<' '<<ma<<endl;
  103. ans=min(ans,ma);
  104. }
  105. return ans;
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement