Advertisement
MinhNGUYEN2k4

Untitled

Feb 11th, 2022
1,025
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.59 KB | None | 0 0
  1. //Nguyen Huu Hoang Minh
  2. #include <bits/stdc++.h>
  3. #define sz(x) int(x.size())
  4. #define all(x) x.begin(),x.end()
  5. #define reset(x) memset(x, 0,sizeof(x))
  6. #define pb push_back
  7. #define mp make_pair
  8. #define fi first
  9. #define se second
  10. #define N 1005
  11. #define remain(x) if (x > MOD) x -= MOD
  12. #define ii pair<int, int>
  13. #define iiii pair< ii , ii >
  14. #define viiii vector< iiii >
  15. #define vi vector<int>
  16. #define vii vector< ii >
  17. #define bit(x, i) (((x) >> (i)) & 1)
  18. #define Task "maze"
  19. #define int long long
  20.  
  21. using namespace std;
  22.  
  23. typedef long double ld;
  24. const int inf = 1e10;
  25. const int minf = -1e10;
  26.  
  27. int n, q, id;
  28. int a[N][N];
  29. map<ii,int> cnt;
  30. int d[N][N], tim[N][N], TimeVisit;
  31. int dis[1000001], f[1000001][21];
  32. ii root;
  33. int tplt[1000001], lt=0;
  34.  
  35. void readfile()
  36. {
  37.     ios_base::sync_with_stdio(false);
  38.     cin.tie(0);cout.tie(0);
  39.     if (fopen(Task".inp","r"))
  40.     {
  41.         freopen(Task".inp","r",stdin);
  42.         freopen(Task".out","w",stdout);
  43.     }
  44.     cin >> n >> q;
  45.     for(int i=1; i<=n; i++){
  46.         string s; cin >> s;
  47.         for(int j=1; j<=n; j++){
  48.             a[i][j] = s[j-1]-'0';
  49.             if (a[i][j]==0){
  50.                 cnt[ii(i,j)]=++id;
  51.             }
  52.         }
  53.     }
  54. }
  55.  
  56. int dx[4] = {1,-1,0,0};
  57. int dy[4] = {0,0,1,-1};
  58.  
  59. bool OK(int x, int y){
  60.     return 1 <= x && x <= n && 1 <= y && y <= n && a[x][y]==0;
  61. }
  62.  
  63. void sub1(){
  64.     while (q--){
  65.         int ty; cin >> ty;
  66.         if (ty==1){
  67.             int u, v; cin >> u >> v;
  68.             a[u][v]=1;
  69.         }
  70.         else{
  71.             int u, v, x, y; cin >> u >> v >> x >> y;
  72.             queue<ii> q;
  73.             bool ok = false;
  74.             q.push(ii(u,v)); TimeVisit++; d[u][v] = 1; tim[u][v] = TimeVisit;
  75.             while (q.size()){
  76.                 int U = q.front().fi;
  77.                 int V = q.front().se;
  78.                 q.pop();
  79.                 if (U==x && V==y){
  80.                     cout << d[U][V] << '\n';
  81.                     ok = true;
  82.                     break;
  83.                 }
  84.                 for(int i=0; i<4; i++){
  85.                     int X = U + dx[i];
  86.                     int Y = V + dy[i];
  87.                     if (!OK(X,Y) || tim[X][Y]==TimeVisit) continue;
  88.                     tim[X][Y] = TimeVisit;
  89.                     d[X][Y] = d[U][V]+1;
  90.                     q.push(ii(X,Y));
  91.                 }
  92.             }
  93.             if (!ok) cout << -1 << '\n';
  94.         }
  95.     }
  96. }
  97.  
  98. void dfs(ii st, ii par){
  99.     int u = cnt[st];
  100.     for(int i=1; i<=20; i++){
  101.         f[u][i] = f[f[u][i-1]][i-1];
  102.     }
  103.     for(int i=0; i<4; i++){
  104.         int x = st.fi + dx[i];
  105.         int y = st.se + dy[i];
  106.         if (!OK(x,y) || (x==par.fi && y==par.se)) continue;
  107.         int v = cnt[ii(x,y)];
  108.         f[v][0] = u; dis[v] = dis[u] + 1;
  109.         dfs(ii(x,y),st);
  110.     }
  111. }
  112.  
  113. int lca(int u, int v){
  114.     if (dis[u] < dis[v]) swap(u,v);
  115.     int delta = dis[u]-dis[v];
  116.     for(int i=20; i>=0; i--) if ((delta>>i)&1) u = f[u][i];
  117.     if (u==v) return u;
  118.     for(int i=20; i>=0; i--){
  119.         if (f[u][i]!=f[v][i]){
  120.             u =f[u][i];
  121.             v= f[v][i];
  122.         }
  123.     }
  124.     return f[u][0];
  125. }
  126.  
  127. int calc(int u, int v){
  128.     int z = lca(u,v);
  129.     return dis[u] + dis[v] - 2*dis[z];
  130. }
  131.  
  132. void DFS(ii st, ii par){
  133.     int u = cnt[st]; tplt[u] = lt;
  134.     for(int i=0; i<4; i++){
  135.         int x = st.fi + dx[i];
  136.         int y = st.se + dy[i];
  137.         if (!OK(x,y) || (x==par.fi && y==par.se)) continue;
  138.         DFS(ii(x,y),st);
  139.     }
  140. }
  141.  
  142. void sub2(){
  143.     for(int i=1; i<=n; i++){
  144.         bool ok = false;
  145.         for(int j=1; j<=n; j++){
  146.             if (a[i][j]==1) continue;
  147.             root = ii(i,j);
  148.             ok = true;
  149.             break;
  150.         }
  151.         if (ok) break;
  152.     }
  153.     dis[cnt[root]] = 1;
  154.     dfs(root,ii(-1,-1));
  155.     while (q--){
  156.         int ty; cin >> ty;
  157.         if (ty==2){
  158.             int u, v, x, y; cin >> u >> v >> x >> y;
  159.             int U = cnt[ii(u,v)];
  160.             int V = cnt[ii(x,y)];
  161.             if (tplt[U]==tplt[V] && tplt[U]!=-1)
  162.                 cout << calc(U,V)+1 << '\n';
  163.             else cout << -1 << '\n';
  164.         }
  165.         else{
  166.             int u, v; cin >> u >> v;
  167.             a[u][v] = 1;
  168.             int id = cnt[ii(u,v)]; tplt[id] = -1;
  169.             for(int i=0; i<4; i++){
  170.                 int x = u + dx[i];
  171.                 int y = v + dy[i];
  172.                 if (!OK(x,y)) continue;
  173.                 lt++; DFS(ii(x,y),ii(u,v));
  174.             }
  175.         }
  176.     }
  177. }
  178.  
  179. void proc()
  180. {
  181.     //sub2(); exit(0);
  182.     if (n <= 100 && q <= 100) sub1();
  183.     else sub2();
  184. }
  185.  
  186. signed main()
  187. {
  188.     readfile();
  189.     proc();
  190.     return 0;
  191. }
  192.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement