Kevin_Zhang

Untitled

Apr 25th, 2020
735
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.03 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. using ll = long long;
  4. #define pb emplace_back
  5. #define int ll
  6.  
  7. const int maxn = 82;
  8. const ll inf = 1ll << 55;
  9. int n, m;
  10. int x[maxn], y[maxn];
  11. double dp[maxn][maxn];
  12. ll sq(ll v) { return v * v; }
  13. int h[maxn];
  14. ll u, d, b;
  15. void make(int x1, int y1, int x2, int y2) {
  16.     u = y1-y2;
  17.     d = x1-x2;
  18.     if (d < 0) d = -d, u = -u;
  19.     b = y1 * d - x1 * u;
  20. }
  21. int F(ll x) {
  22.     ll val = x * u + b, res = val / d;
  23.     return (res * d == val ? res : res+1);
  24. }
  25. pair<ll,ll> FD(ll x) {
  26.     return {x * u + b, d};
  27. }
  28. bool fok(int x1, int y1, int x2, int y2) {
  29.     if (x1 > x2) swap(x1, x2), swap(y1, y2);
  30.     {
  31.         bool same;
  32.         int a = lower_bound(x, x+n, x1)-x, b = lower_bound(x, x+n, x2)-x;
  33.         same = a == b;
  34.         if (a == b && ((a&1) || (x[a] == x1 && x1 == x2))) {
  35.             return true;
  36.         }
  37.         a = lower_bound(y, y+n, y1)-y, b = lower_bound(y, y+n, y2)-y;
  38.         if (a == b && ((a&1) || (y[a] == y1 && y1 == y2)) ){
  39.             return true;
  40.         }
  41.         if (same && a == b) {
  42.             return true;
  43.         }
  44.         if (same ^ (a==b))
  45.             return false;
  46.     }
  47.     make(x1, y1, x2, y2);
  48.     for (int i = 0;i < n;++i) {
  49.         if (x[i] < x1 || (x[i] == x1 && (~i&1))) continue;
  50.         if (x[i] >= x2 && (i&1)) break;
  51.         int val = F(x[i]);
  52.         int p = lower_bound(y, y+n, val) - y;
  53.         if (y[p] * d == (u * x[i] + b)) {
  54.             if (y1 < y2 && ((~p&1) ^ (i&1))) return false;
  55.             if (y1 > y2 && (  p&1) ^ (i&1)) return false;
  56.         }
  57.         else {
  58.             if ((~p) & 1) return false;
  59.             auto [u, d] = FD(min(x[i+1], x2));
  60.             if (y1 < y2 && (i&1) && u > d * y[p]) return false;
  61.             if (y1 > y2 && (i&1) && u < d * y[p-1]) return false;
  62.         }
  63.     }
  64.     return true;
  65. }
  66. #define ok fok
  67. double solve(int x1, int y1, int x2, int y2) {
  68.     if (fok(x1, y1, x2, y2))
  69.         return sqrt(sq(x1-x2) + sq(y1-y2));
  70.     for (int i = 0;i < maxn;++i)
  71.         for (int j = 0;j < maxn;++j)
  72.             dp[i][j] = inf;
  73.  
  74.     double res = inf;
  75.     int hr = 0;
  76.     while (x[hr+1] <= x1) ++hr;
  77.     for (int i = hr;i < m-2;++i) {
  78.         for (int j = 0;j < n-2;++j) {
  79.             if (ok(x1, y1, x[i], y[j])) {
  80.                 dp[i][j] = sqrt(sq(x1-x[i]) + sq(y1-y[j]));
  81.             }
  82.         }
  83.     }
  84.     int cnt = 0;
  85.     for (int i = hr;i < m;++i) {
  86.         if (x[i] > x2 && ++cnt == 2) break;
  87.         for (int j = 0;j < n-2;++j) {
  88.             for (int k = 0;k < n-2;++k)
  89.                 dp[i][k] = min(dp[i][k], dp[i][j] + abs(y[k]-y[j]));
  90.  
  91.             for (int k = i+1;k < m-2;++k) {
  92.                 for (int l = 0;l < n-2;++l)
  93.                     if (ok(x[i], y[j], x[k], y[l])) {
  94.                         dp[k][l] = min(dp[k][l], dp[i][j] + sqrt(sq(x[k]-x[i]) + sq(y[l]-y[j])));
  95.                     }
  96.             }
  97.             if (fok(x[i], y[j], x2, y2)) {
  98.                 res = min(res, dp[i][j] + sqrt(sq(x2-x[i]) + sq(y2-y[j])));
  99.             }
  100.         }
  101.     }
  102.     return res;
  103. }
  104. signed main() {
  105.     ios_base::sync_with_stdio(0), cin.tie(0);
  106.     cout << fixed << setprecision(15);
  107.     cin >> n >> m;
  108.     n <<= 1, m <<= 1;
  109.     for (int i = 0;i < n;++i)
  110.         cin >> y[i];
  111.     for (int i = 0;i < m;++i)
  112.         cin >> x[i];
  113.     y[n++] = 200000;
  114.     y[n++] = 200001;
  115.     x[m++] = 200000;
  116.     x[m++] = 200001;
  117.     int q;
  118.     cin >> q;
  119.     while (q--) {
  120.         int x1, x2, y1, y2;
  121.         cin >> x1 >> y1 >> x2 >> y2;
  122.         if (x1 > x2)
  123.             swap(x1, x2), swap(y1, y2);
  124.         cout << solve(x1, y1, x2, y2) << '\n';
  125.     }
  126. }
Advertisement
Add Comment
Please, Sign In to add comment