Advertisement
welleyth

Day 3. D. Vikings and Treasure

Aug 18th, 2021
1,094
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.19 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <ext/pb_ds/assoc_container.hpp>
  3. #include <ext/pb_ds/tree_policy.hpp>
  4.  
  5. using namespace std;
  6. using namespace __gnu_pbds;
  7.  
  8. #define pb push_back
  9. #define int long long
  10. #define uint __int128
  11. #define mp make_pair
  12. #define left left_compile
  13. #define right right_compile
  14.  
  15. #pragma GCC optimize("O3")
  16. #pragma GCC optimize("unroll-loops")
  17.  
  18. const int INF = (int)1e18;
  19. const int md = (int)1e9 + 7;
  20. const int MAXN = (int)1e6 + 111;
  21. const int N = (int)700 + 11;
  22. const int debug = 0;
  23. const long double eps = 1e-7;
  24.  
  25. typedef tree<
  26. int,
  27. null_type,
  28. less_equal<int>,
  29. rb_tree_tag,
  30. tree_order_statistics_node_update>
  31. ordered_set;
  32.  
  33. int bpow(int a,int b){
  34.     if(b == 0)
  35.         return 1ll;
  36.     if(b % 2 == 0){
  37.         int t = bpow(a,b/2);
  38.         return (t * t) % md;
  39.     }
  40.     return (a * bpow(a,b-1)) % md;
  41. }
  42.  
  43. int inv(int a){ /// return 1/a by PRIME modulo md
  44.     return bpow(a,md-2);
  45. }
  46.  
  47. void myerase(ordered_set& st, int t){
  48.     int r = st.order_of_key(t);
  49.     ordered_set::iterator it = st.find_by_order(r);
  50.     st.erase(it);
  51.     return;
  52. }
  53.  
  54. mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
  55.  
  56. void init(){
  57.     return;
  58. }
  59.  
  60. const int DX[] = {0,1,0,-1};
  61. const int DY[] = {1,0,-1,0};
  62.  
  63. bool g[N][N];
  64. int d[3][N][N];
  65.  
  66. void solve_case(){
  67.     int n,m;
  68.     cin >> n >> m;
  69.  
  70.     string s;
  71.     int Vx,Vy;
  72.     int Sx,Sy;
  73.     int Fx,Fy;
  74.     for(int i = 0; i <= n + 1; i++){
  75.         for(int j = 0; j <= m + 1; j++){
  76.             g[i][j] = true;
  77.             d[0][i][j] = d[1][i][j] = d[2][i][j] = INF;
  78.         }
  79.     }
  80.     for(int i = 1; i <= n; i++){
  81.         cin >> s;
  82.         for(int j = 1; j <= m; j++){
  83.             if(s[j-1] == 'I')
  84.                 g[i][j] = true;
  85.             else
  86.                 g[i][j] = false;
  87.             if(s[j-1] == 'V')
  88.                 Vx = i, Vy = j;
  89.             if(s[j-1] == 'Y')
  90.                 Sx = i, Sy = j;
  91.             if(s[j-1] == 'T')
  92.                 Fx = i, Fy = j;
  93.         }
  94.     }
  95.  
  96.     d[0][Vx][Vy] = 0;
  97.     deque<pair<int,int>> q;
  98.     q.push_front(mp(Vx,Vy));
  99.     while(!q.empty()){
  100.         int x = q.front().first, y = q.front().second;
  101.         q.pop_front();
  102.         for(int i = 0; i < 4; i++){
  103.             int xn = x + DX[i], yn = y + DY[i];
  104.             if(xn > 0 && xn <= n && yn > 0 && yn <= m && !g[xn][yn] && d[0][xn][yn] > d[0][x][y] + 1){
  105.                 q.push_back(mp(xn,yn));
  106.                 d[0][xn][yn] = d[0][x][y] + 1;
  107.             }
  108.         }
  109.     }
  110.     for(int i = 1; i <= n; i++){
  111.         for(int j = 1; j <= m; j++){
  112.             for(int t = j; t > 0; t--){
  113.                 if(g[i][t])
  114.                     break;
  115.                 d[1][i][t] = min(d[1][i][t],d[0][i][j]);
  116.             }
  117.             for(int t = j; t <= m; t++){
  118.                 if(g[i][t])
  119.                     break;
  120.                 d[1][i][t] = min(d[1][i][t],d[0][i][j]);
  121.             }
  122.             for(int t = i; t > 0; t--){
  123.                 if(g[t][j])
  124.                     break;
  125.                 d[1][t][j] = min(d[1][t][j],d[0][i][j]);
  126.             }
  127.             for(int t = i; t <= n; t++){
  128.                 if(g[t][j])
  129.                     break;
  130.                 d[1][t][j] = min(d[1][t][j],d[0][i][j]);
  131.             }
  132.         }
  133.     }
  134.  
  135.     d[2][Sx][Sy] = 0;
  136.     q.push_back(mp(Sx,Sy));
  137.     while(!q.empty()){
  138.         int x = q.front().first, y = q.front().second;
  139.         q.pop_front();
  140.         for(int i = 0; i < 4; i++){
  141.             int xn = x + DX[i], yn = y + DY[i];
  142.             if(xn > 0 && xn <= n && yn > 0 && yn <= m && !g[xn][yn] && d[2][xn][yn] > d[2][x][y] + 1
  143.             && d[2][x][y] + 1 < d[1][xn][yn]){
  144.                 q.push_back(mp(xn,yn));
  145.                 d[2][xn][yn] = d[2][x][y] + 1;
  146.             }
  147.         }
  148.     }
  149.  
  150.     if(d[2][Fx][Fy] == INF)
  151.         cout << "NO";
  152.     else
  153.         cout << "YES";
  154.  
  155.     return;
  156. }
  157.  
  158. signed main(){
  159.     ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  160. //    freopen("input.txt","r",stdin);
  161. //    freopen("output.txt","w",stdout);
  162.  
  163.     init();
  164.  
  165.     int tests = 1;
  166. //    cin >> tests;
  167.  
  168.     for(int _ = 1; _ <= tests; _++){
  169.         solve_case();
  170.     }
  171.  
  172.     return 0;
  173. }
  174.  
  175. /*
  176. .Y.....
  177. ..I....
  178. ..IIIII
  179. ..Y....
  180. ...T...
  181.  
  182. */
  183.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement