Advertisement
cheater2k

POI XIII - Frogs

Nov 17th, 2017
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.81 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int N = 1010;
  5. const int inf = 2e4;
  6.  
  7. int n, m;
  8. int l[N][N], r[N][N];
  9. int up[N][N], dn[N][N];
  10. int sx, sy, ex, ey;
  11.  
  12. int in_row(int i, int j) {
  13.     int dist = inf;
  14.     dist = min(dist, l[i][j] ? j - l[i][j] : inf);
  15.     dist = min(dist, r[i][j] ? r[i][j] - j : inf);
  16.     return dist;
  17. }
  18.  
  19. struct ConvexHullTrick {
  20.     struct line { int a; int b; };
  21.     vector<line> L;
  22.     int ptr;
  23.     ConvexHullTrick() { L.clear(); ptr = 0; }
  24.  
  25.     bool bad(line l1, line l2, line l3) {
  26.         return 1LL * (l1.b - l2.b) * (l2.a - l3.a) < 1LL * (l3.b - l2.b) * (l2.a - l1.a);
  27.     }
  28.     void add(int a, int b) {
  29.         line d = {a,b};
  30.         while(L.size() >= 2 && bad(L[L.size()-2], L[L.size()-1], d)) L.pop_back();
  31.         L.push_back(d);
  32.     }
  33.     int get(int x) {
  34.         if (L.empty()) return inf * inf;
  35.         if (ptr > L.size()-1) ptr = L.size()-1;
  36.         while(ptr < L.size()-1 && L[ptr].a * x + L[ptr].b > L[ptr+1].a * x + L[ptr+1].b) ++ptr;
  37.         return L[ptr].a * x + L[ptr].b;
  38.     }
  39. } cht;
  40.  
  41. int cell(int i, int j) { return (i-1) * m + (j-1); }
  42.  
  43. typedef pair<int,int> ii;
  44. vector< pair<int, ii> > vec;
  45. int par[N * N];
  46. const int dx[] = {-1,1,0,0}, dy[] = {0,0,-1,1};
  47.  
  48. int anc(int p) { return p == par[p] ? p : par[p] = anc(par[p]); }
  49. void join(int p, int q) { p = anc(p); q = anc(q); par[p] = q; }
  50.  
  51. int main() {
  52.     ios_base::sync_with_stdio(false); cin.tie(0);
  53.     cin >> n >> m;
  54.     cin >> sx >> sy >> ex >> ey;
  55.     int num; cin >> num;
  56.     while(num-- > 0) {
  57.         int x, y; cin >> x >> y;
  58.         l[x][y] = y; r[x][y] = y;
  59.     }
  60.     for (int i = 1; i <= n; ++i) {
  61.         for (int j = 1; j <= m; ++j) if (l[i][j] == 0) l[i][j] = l[i][j-1];
  62.         for (int j = m; j >= 1; --j) if (r[i][j] == 0) r[i][j] = r[i][j+1];
  63.     }
  64.  
  65.     for (int j = 1; j <= m; ++j) {
  66.         cht = ConvexHullTrick();
  67.         for (int i = 1; i <= n; ++i) {
  68.             int d = in_row(i,j);
  69.             up[i][j] = min(d * d, i * i + cht.get(i));
  70.             if (d != inf) cht.add(-2 * i, d * d + i * i);
  71.         }
  72.  
  73.         cht = ConvexHullTrick();
  74.         for (int i = n; i >= 1; --i) {
  75.             int d = in_row(i,j);
  76.             dn[i][j] = min(d * d, i * i + cht.get(-i));
  77.             if (d != inf) cht.add(2 * i, d * d + i * i);
  78.         }
  79.  
  80.         for (int i = 1; i <= n; ++i) {
  81.             int TIME = min(up[i][j], dn[i][j]);
  82.             vec.push_back(make_pair(TIME, ii(i, j)));
  83.         }
  84.     }
  85.     for (int i = 0; i < n * m; ++i) par[i] = -1;
  86.  
  87.     int s = cell(sx, sy);
  88.     int e = cell(ex, ey);
  89.     sort(vec.begin(), vec.end(), greater< pair<int,ii> >());
  90.     for (int i = 0; i < vec.size(); ++i) {
  91.         int x = vec[i].second.first, y = vec[i].second.second;
  92.         par[cell(x,y)] = cell(x,y);
  93.  
  94.         for (int dir = 0; dir < 4; ++dir) {
  95.             int nx = x + dx[dir], ny = y + dy[dir];
  96.             if (nx <= 0 || nx > n || ny <= 0 || ny > m || par[cell(nx,ny)] == -1) continue;
  97.             join(cell(x,y), cell(nx,ny));
  98.         }
  99.        
  100.         if (par[s] != -1 && par[e] != -1 && anc(s) == anc(e)) {
  101.             printf("%d\n", vec[i].first);
  102.             return 0;
  103.         }
  104.     }
  105.  
  106.     printf("0\n");
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement