Advertisement
Guest User

Untitled

a guest
Nov 18th, 2019
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.96 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define sz(x) ((int) (x).size())
  6. #define all(x) (x).begin(), (x).end()
  7. #define fi first
  8. #define se second
  9. #define mp make_pair
  10. #define pb push_back
  11. #define re return
  12. #define endl '\n'
  13. #define makeunique(x) sort(all(x)), (x).resize(unique(all(x)) - (x).begin())
  14.  
  15. using ll = long long;
  16. using ull = unsigned long long;
  17. using ii = pair<int, int>;
  18. using vi = vector<int>;
  19. using vii = vector<ii>;
  20. using ld = long double;
  21.  
  22. template <class T> T abs (T x) { re x > 0 ? x : -x; }
  23. template <class T> T sqr (T x) { re x * x; }
  24.  
  25. const ld pi = 4 * atan(1.);
  26. const ll inf = 1e18 + 7;
  27. const int N = 2e3 + 17;
  28.  
  29. int n, m;
  30. int xs, ys, xf, yf;
  31. vi sx, sy;
  32.  
  33. struct rec {
  34. int x1, y1, x2, y2, t;
  35. } a[N];
  36.  
  37. int getx (int x) {
  38. re lower_bound(sx.begin(), sx.end(), x) - sx.begin();
  39. }
  40.  
  41. int gety (int y) {
  42. re lower_bound(sy.begin(), sy.end(), y) - sy.begin();
  43. }
  44.  
  45. vi o[N], c[N];
  46. ll g[4 * 1002 * 1002][4];
  47. int cnt = 0;
  48.  
  49. void gox() {
  50. for (int i = 0; i < n; i++) {
  51. o[getx(a[i].x1)].pb(i);
  52. c[getx(a[i].x2)].pb(i);
  53. }
  54. vi seg(sz(sy), -1);
  55. for (int i = 0; i < sz(sx); i++) {
  56. for (auto p : c[i]) {
  57. auto l = gety(a[p].y1);
  58. auto r = gety(a[p].y2);
  59. for (int j = l; j <= r; j++) seg[j] = -1;
  60. }
  61. for (int j = 0; j < sz(sy) - 1; j++) {
  62. int l = i * sz(sy) + j;
  63. int r = l + 1;
  64. ll d = sy[j + 1] - sy[j];
  65. if (seg[j] != -1 && seg[j] == seg[j + 1]) d *= a[seg[j]].t;
  66. else d *= 10;
  67. g[l][0] = d;
  68. g[r][1] = d;
  69. }
  70. for (auto p : o[i]) {
  71. auto l = gety(a[p].y1);
  72. auto r = gety(a[p].y2);
  73. for (int j = l; j <= r; j++) seg[j] = p;
  74. }
  75. }
  76. }
  77.  
  78. void goy() {
  79. for (int i = 0; i < sz(sx); i++) c[i].clear(), o[i].clear();
  80. for (int i = 0; i < n; i++) {
  81. o[gety(a[i].y1)].pb(i);
  82. c[gety(a[i].y2)].pb(i);
  83. }
  84. vi seg(sz(sx), -1);
  85. for (int i = 0; i < sz(sy); i++) {
  86. for (auto p : c[i]) {
  87. auto l = getx(a[p].x1);
  88. auto r = getx(a[p].x2);
  89. for (int j = l; j <= r; j++) seg[j] = -1;
  90. }
  91. for (int j = 0; j < sz(sx) - 1; j++) {
  92. int l = j * sz(sy) + i;
  93. int r = (j + 1) * sz(sy) + i;
  94. ll d = sx[j + 1] - sx[j];
  95. if (seg[j] != -1 && seg[j] == seg[j + 1]) d *= a[seg[j]].t;
  96. else d *= 10;
  97. g[l][2] = d;
  98. g[r][3] = d;
  99. }
  100. for (auto p : o[i]) {
  101. auto l = getx(a[p].x1);
  102. auto r = getx(a[p].x2);
  103. for (int j = l; j <= r; j++) seg[j] = p;
  104. }
  105. }
  106. }
  107.  
  108. ll d[4 * 1002 * 1002];
  109. int t[2 * 4 * 1002 * 1002];
  110.  
  111. inline void upd (int pos) {
  112. for (int i = (n + pos) >> 1; i; i >>= 1) {
  113. int l = t[i << 1];
  114. int r = t[(i << 1) | 1];
  115. t[i] = d[l] < d[r] ? l : r;
  116. }
  117. }
  118.  
  119. inline void upd1 (int pos) {
  120. auto cur = d[pos];
  121. int x = pos;
  122. pos = (pos + n) >> 1;
  123. while (pos && (d[t[pos]] >= cur)) {
  124. t[pos] = x;
  125. pos >>= 1;
  126. }
  127. }
  128.  
  129. int main() {
  130. // freopen("drive.in", "r", stdin);
  131. // freopen("drive.out", "w", stdout);
  132. ios::sync_with_stdio();
  133. cin.tie(0); cout.tie(0);
  134. cin >> xs >> ys >> xf >> yf;
  135. cin >> n;
  136. for (int i = 0; i < n; i++) {
  137. int x1, y1, x2, y2, t;
  138. cin >> x1 >> y1 >> x2 >> y2 >> t;
  139. a[i] = {x1, y1, x2, y2, t};
  140. sx.pb(x1); sx.pb(x2);
  141. sy.pb(y1); sy.pb(y2);
  142. }
  143. sx.pb(xs), sx.pb(xf);
  144. sy.pb(ys), sy.pb(yf);
  145. makeunique(sx), makeunique(sy);
  146. gox(), goy();
  147. int start = sz(sy) * getx(xs) + gety(ys);
  148. int finish = sz(sy) * getx(xf) + gety(yf);
  149. n = sz(sx) * sz(sy);
  150. for (int i = 0; i < n; i++) d[i] = inf;
  151. d[start] = 0;
  152. for (int i = n; i < 2 * n; i++) t[i] = i - n;
  153. for (int i = n - 1; i; i--) {
  154. int l = t[i << 1];
  155. int r = t[(i << 1) | 1];
  156. t[i] = d[l] < d[r] ? l : r;
  157. }
  158.  
  159. int dx[4] = {1, -1, sz(sy), -sz(sy)};
  160.  
  161. while (1) {
  162. auto best = t[1];
  163. if (best == finish) break;
  164. auto cur = d[best];
  165. d[best] = inf;
  166. upd(best);
  167. for (int j = 0; j < 4; j++)
  168. if (g[best][j]) {
  169. int to = best + dx[j];
  170. ll dist = cur + g[best][j];
  171. if (dist < d[to]) {
  172. d[to] = dist;
  173. upd1(to);
  174. }
  175. g[to][j ^ 1] = 0;
  176. }
  177. }
  178. cout << d[finish];
  179. cerr << clock() << endl;
  180. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement