Advertisement
Dmaxiya

洛谷 -B4208 [常州市赛 2021] 移动 参考代码

May 21st, 2025
145
1
177 days
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.40 KB | None | 1 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long LL;
  5. const int maxn = 600 + 100;
  6. const LL INF = 0x3f3f3f3f3f3f3f3f;
  7. struct Node {
  8.     int x, h1, h2;
  9. };
  10.  
  11. int n, m, k, T, sx, sy, tx, ty;
  12. LL ans;
  13. LL dis[maxn][maxn];
  14. Node node[maxn];
  15.  
  16. pair<int, int> findLR(int x, int y) {
  17.     pair<int, int> p(-1, -1);
  18.     for (int i = 0; i < k; ++i) {
  19.         if (node[i].h1 <= y && node[i].h2 >= y) {
  20.             if (node[i].x <= x) {
  21.                 if (p.first == -1) {
  22.                     p.first = i;
  23.                 } else {
  24.                     if (node[p.first].x < node[i].x) {
  25.                         p.first = i;
  26.                     }
  27.                 }
  28.             }
  29.             if (node[i].x >= x) {
  30.                 if (p.second == -1) {
  31.                     p.second = i;
  32.                 } else {
  33.                     if (node[p.second].x > node[i].x) {
  34.                         p.second = i;
  35.                     }
  36.                 }
  37.             }
  38.         }
  39.     }
  40.     return p;
  41. }
  42.  
  43. LL calDis(int sidx, int tidx) {
  44.     if (sidx == -1 || tidx == -1) {
  45.         return INF;
  46.     }
  47.     if (dis[sidx << 1][tidx << 1 | 1] == INF) {
  48.         return INF;
  49.     }
  50.     return dis[sidx << 1][tidx << 1 | 1]
  51.         - (node[tidx].h2 - ty)
  52.         - (sy - node[sidx].h1)
  53.         + abs(sx - node[sidx].x)
  54.         + abs(tx - node[tidx].x);
  55. }
  56.  
  57. int main() {
  58. #ifdef ExRoc
  59.     freopen("test.txt", "r", stdin);
  60. #endif // ExRoc
  61.     ios::sync_with_stdio(false);
  62.  
  63.     cin >> n >> m >> k;
  64.     memset(dis, 0x3f, sizeof(dis));
  65.     for (int i = 0; i < k; ++i) {
  66.         cin >> node[i].x >> node[i].h1 >> node[i].h2;
  67.     }
  68.     for (int i = 0; i < k; ++i) {
  69.         for (int j = 0; j < k; ++j) {
  70.             if (i == j) {
  71.                 dis[i << 1][j << 1] = dis[i << 1 | 1][j << 1 | 1] = 0;
  72.                 dis[i << 1][j << 1 | 1] = dis[i << 1 | 1][j << 1] = node[i].h2 - node[i].h1;
  73.                 continue;
  74.             }
  75.             if (node[i].h1 >= node[j].h1 && node[i].h1 <= node[j].h2) {
  76.                 dis[i << 1][j << 1] = dis[j << 1][i << 1] = abs(node[i].x - node[j].x) + (node[i].h1 - node[j].h1);
  77.                 dis[i << 1][j << 1 | 1] = dis[j << 1 | 1][i << 1] = abs(node[i].x - node[j].x) + (node[j].h2 - node[i].h1);
  78.             }
  79.             if (node[i].h2 >= node[j].h1 && node[i].h2 <= node[j].h2) {
  80.                 dis[i << 1 | 1][j << 1] = dis[j << 1][i << 1 | 1] = abs(node[i].x - node[j].x) + (node[i].h2 - node[j].h1);
  81.                 dis[i << 1 | 1][j << 1 | 1] = dis[j << 1 | 1][i << 1 | 1] = abs(node[i].x - node[j].x) + (node[j].h2 - node[i].h2);
  82.             }
  83.         }
  84.     }
  85.     int k2 = k << 1;
  86.     for (int kk = 0; kk < k2; ++kk) {
  87.         for (int i = 0; i < k2; ++i) {
  88.             for (int j = 0; j < k2; ++j) {
  89.                 dis[i][j] = min(dis[i][j], dis[i][kk] + dis[kk][j]);
  90.             }
  91.         }
  92.     }
  93.     cin >> T;
  94.     while (T--) {
  95.         cin >> sx >> sy >> tx >> ty;
  96.         if (sy == ty) {
  97.             cout << abs(sx - tx) << endl;
  98.             continue;
  99.         }
  100.         if (sy > ty) {
  101.             swap(sx, tx);
  102.             swap(sy, ty);
  103.         }
  104.         pair<int, int> sp = findLR(sx, sy);
  105.         pair<int, int> tp = findLR(tx, ty);
  106.         ans = min({calDis(sp.first, tp.first), calDis(sp.first, tp.second), calDis(sp.second, tp.first), calDis(sp.second, tp.second)});
  107.         cout << (ans == INF ? -1 : ans) << endl;
  108.     }
  109.  
  110.     return 0;
  111. }
  112.  
Advertisement
Comments
Add Comment
Please, Sign In to add comment
Advertisement