Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define sz(x) ((int) (x).size())
- #define all(x) (x).begin(), (x).end()
- #define fi first
- #define se second
- #define mp make_pair
- #define pb push_back
- #define re return
- #define endl '\n'
- #define makeunique(x) sort(all(x)), (x).resize(unique(all(x)) - (x).begin())
- using ll = long long;
- using ull = unsigned long long;
- using ii = pair<int, int>;
- using vi = vector<int>;
- using vii = vector<ii>;
- using ld = long double;
- template <class T> T abs (T x) { re x > 0 ? x : -x; }
- template <class T> T sqr (T x) { re x * x; }
- const ld pi = 4 * atan(1.);
- const ll inf = 1e18 + 7;
- const int N = 2e3 + 17;
- int n, m;
- int xs, ys, xf, yf;
- vi sx, sy;
- struct rec {
- int x1, y1, x2, y2, t;
- } a[N];
- int getx (int x) {
- re lower_bound(sx.begin(), sx.end(), x) - sx.begin();
- }
- int gety (int y) {
- re lower_bound(sy.begin(), sy.end(), y) - sy.begin();
- }
- vi o[N], c[N];
- ll g[4 * 1002 * 1002][4];
- int cnt = 0;
- void gox() {
- for (int i = 0; i < n; i++) {
- o[getx(a[i].x1)].pb(i);
- c[getx(a[i].x2)].pb(i);
- }
- vi seg(sz(sy), -1);
- for (int i = 0; i < sz(sx); i++) {
- for (auto p : c[i]) {
- auto l = gety(a[p].y1);
- auto r = gety(a[p].y2);
- for (int j = l; j <= r; j++) seg[j] = -1;
- }
- for (int j = 0; j < sz(sy) - 1; j++) {
- int l = i * sz(sy) + j;
- int r = l + 1;
- ll d = sy[j + 1] - sy[j];
- if (seg[j] != -1 && seg[j] == seg[j + 1]) d *= a[seg[j]].t;
- else d *= 10;
- g[l][0] = d;
- g[r][1] = d;
- }
- for (auto p : o[i]) {
- auto l = gety(a[p].y1);
- auto r = gety(a[p].y2);
- for (int j = l; j <= r; j++) seg[j] = p;
- }
- }
- }
- void goy() {
- for (int i = 0; i < sz(sx); i++) c[i].clear(), o[i].clear();
- for (int i = 0; i < n; i++) {
- o[gety(a[i].y1)].pb(i);
- c[gety(a[i].y2)].pb(i);
- }
- vi seg(sz(sx), -1);
- for (int i = 0; i < sz(sy); i++) {
- for (auto p : c[i]) {
- auto l = getx(a[p].x1);
- auto r = getx(a[p].x2);
- for (int j = l; j <= r; j++) seg[j] = -1;
- }
- for (int j = 0; j < sz(sx) - 1; j++) {
- int l = j * sz(sy) + i;
- int r = (j + 1) * sz(sy) + i;
- ll d = sx[j + 1] - sx[j];
- if (seg[j] != -1 && seg[j] == seg[j + 1]) d *= a[seg[j]].t;
- else d *= 10;
- g[l][2] = d;
- g[r][3] = d;
- }
- for (auto p : o[i]) {
- auto l = getx(a[p].x1);
- auto r = getx(a[p].x2);
- for (int j = l; j <= r; j++) seg[j] = p;
- }
- }
- }
- ll d[4 * 1002 * 1002];
- int t[2 * 4 * 1002 * 1002];
- inline void upd (int pos) {
- for (int i = (n + pos) >> 1; i; i >>= 1) {
- int l = t[i << 1];
- int r = t[(i << 1) | 1];
- t[i] = d[l] < d[r] ? l : r;
- }
- }
- inline void upd1 (int pos) {
- auto cur = d[pos];
- int x = pos;
- pos = (pos + n) >> 1;
- while (pos && (d[t[pos]] >= cur)) {
- t[pos] = x;
- pos >>= 1;
- }
- }
- int main() {
- // freopen("drive.in", "r", stdin);
- // freopen("drive.out", "w", stdout);
- ios::sync_with_stdio();
- cin.tie(0); cout.tie(0);
- cin >> xs >> ys >> xf >> yf;
- cin >> n;
- for (int i = 0; i < n; i++) {
- int x1, y1, x2, y2, t;
- cin >> x1 >> y1 >> x2 >> y2 >> t;
- a[i] = {x1, y1, x2, y2, t};
- sx.pb(x1); sx.pb(x2);
- sy.pb(y1); sy.pb(y2);
- }
- sx.pb(xs), sx.pb(xf);
- sy.pb(ys), sy.pb(yf);
- makeunique(sx), makeunique(sy);
- gox(), goy();
- int start = sz(sy) * getx(xs) + gety(ys);
- int finish = sz(sy) * getx(xf) + gety(yf);
- n = sz(sx) * sz(sy);
- for (int i = 0; i < n; i++) d[i] = inf;
- d[start] = 0;
- for (int i = n; i < 2 * n; i++) t[i] = i - n;
- for (int i = n - 1; i; i--) {
- int l = t[i << 1];
- int r = t[(i << 1) | 1];
- t[i] = d[l] < d[r] ? l : r;
- }
- int dx[4] = {1, -1, sz(sy), -sz(sy)};
- while (1) {
- auto best = t[1];
- if (best == finish) break;
- auto cur = d[best];
- d[best] = inf;
- upd(best);
- for (int j = 0; j < 4; j++)
- if (g[best][j]) {
- int to = best + dx[j];
- ll dist = cur + g[best][j];
- if (dist < d[to]) {
- d[to] = dist;
- upd1(to);
- }
- g[to][j ^ 1] = 0;
- }
- }
- cout << d[finish];
- cerr << clock() << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement