Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <string>
- #include <vector>
- #include <algorithm>
- #include <memory.h>
- #include <cmath>
- #include <map>
- #include <set>
- #include <queue>
- #include <stack>
- #include <ctime>
- #include <iostream>
- #include <functional>
- #include <complex>
- #include <stdlib.h>
- #include <fstream>
- #include <random>
- #include <csignal>
- using namespace std;
- typedef long long ll;
- typedef pair<int, int> pii;
- typedef pair<double, double> pdd;
- typedef pair<pii, int> p3i;
- typedef vector<int> vi;
- typedef vector<pii> vii;
- typedef vector<p3i> v3i;
- typedef vector<vii> vvii;
- typedef vector<p3i> vp3i;
- typedef long double ld;
- typedef vector<ld> vld;
- #define pb push_back
- #define mp make_pair
- #define REP(i, n) for (int (i) = 0; (i) < (n); (i)++)
- #define REPD(i, n) for (int (i) = (n) - 1; (i) >= 0; (i)--)
- #define FOR(i, a, b) for (int (i) = (a); (i) < (b); (i)++)
- #define FORD(i,a, b) for (int (i) = (a); (i) >= (b); (i)--)
- #define sz(v) (int)(v).size()
- #define all(v) (v).begin(), (v).end()
- #define rv(v) reverse(all(v))
- #define CL(v, val) memset((v), (val), sizeof((v)))
- #define SORT(a) sort(all(a))
- #define un(v) SORT(v), (v).resize(unique(all(v)) - (v).begin())
- #define eps 1.0e-9
- #define X first
- #define Y second
- #define bit(n) (1 << (n))
- #define bit64(n) (ll(1) << (n))
- #define sqr(x) ((x) * (x))
- #define sq5(x) ((x) * (x) * (x) * (x) * (x))
- #define N 200005
- vector<pair<ll, ll> > Hull[N];
- bool isBad(pair<ll, ll> a, pair<ll, ll> b, pair<ll, ll> c) {
- return 1.0 * (c.Y - a.Y) / (a.X - c.X) - 1.0 * (b.Y - a.Y) / (a.X - b.X) < eps;
- }
- void addLine(vector<pair<ll, ll> > &hull, pair<ll, ll> nw) {
- /*if (sz(hull) && hull.back().X == nw.X) {
- if (hull.back().Y <= nw.Y) {
- return;
- }
- hull.pop_back();
- }*/
- while (sz(hull) >= 2 && isBad(hull[sz(hull) - 2], hull[sz(hull) - 1], nw)) {
- hull.pop_back();
- }
- hull.pb(nw);
- }
- int p[N];
- ll f(pair<ll, ll> line, ll t) {
- return line.X * t + line.Y;
- }
- ll query(int id, ll t) {
- if (p[id] >= sz(Hull[id])) {
- p[id] = sz(Hull[id]) - 1;
- }
- while (p[id] < sz(Hull[id]) - 1 && f(Hull[id][p[id]], t) > f(Hull[id][p[id] + 1], t)) {
- p[id]++;
- }
- return f(Hull[id][p[id]], t);
- }
- map<ll, pair<int, pair<ll, ll> > > tIn, tOut;
- int main(void) {
- int n, m;
- scanf("%d%d", &n, &m);
- addLine(Hull[0], mp(0, 0));
- vector<ll> times;
- REP(i, m) {
- int x, y;
- ll s, e;
- scanf("%d%d%lld%lld", &x, &y, &s, &e);
- x--, y--;
- times.pb(s);
- times.pb(e);
- /*if (s == e && n < 51) {
- return -1;
- }*/
- tOut[s] = mp(x, mp(y, e));
- }
- un(times);
- ll ans = -1;
- REP(i, sz(times)) {
- ll t = times[i];
- if (tOut.count(t)) {
- int u = tOut[t].X;
- int v = tOut[t].Y.X;
- ll t2 = tOut[t].Y.Y;
- if (sz(Hull[u]) == 0) {
- continue;
- }
- ll q = query(u, t);
- ll tmp = sqr(t) + q;
- if (v == n - 1) {
- if (ans == -1 || ans > tmp) {
- ans = tmp;
- }
- }
- tIn[t2] = mp(v, mp(-2ll * t2, sqr(t2) + tmp));
- }
- if (tIn.count(t)) {
- int v = tIn[t].X;
- pair<ll, ll> line = tIn[t].Y;
- addLine(Hull[v], line);
- }
- }
- printf("%lld\n", ans);
- }
- /*
- 2 3
- 1 1 1 1
- 1 1 2 3
- 1 2 4 5
- 2 2
- 1 1 2 4
- 1 2 3 5
- 3 3
- 1 2 1 1
- 1 3 3 3
- 2 3 2 4
- 3 3
- 1 2 2 2
- 2 3 6 9
- 1 3 5 100
- */
Advertisement
Add Comment
Please, Sign In to add comment