Submission #853155

#TimeUsernameProblemLanguageResultExecution timeMemory
853155shiv_213Tracks in the Snow (BOI13_tracks)C++98
100 / 100
488 ms236368 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>

using namespace __gnu_pbds;

using namespace std;
#ifndef ONLINE_JUDGE
// #include "DEBUG.h"
#else
#define debug(...) 69
#endif
#define IOS    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);

#define int long long
#define double long double
#define endl '\n'
#define Endl cout<<'\n';
#define MOD 1000000007
const int M = 1e18;
const int mod=1e9+7;
double pi = 2 * acos(0.0);
#define I =in()
#define S =sin()
#define C =chin()
#define rep(i,a,b)      for(int i=a;i<b;i++)
#define repo(i,a,b)      for(int i=a;i>=b;i--)
#define vfill(arr)       for(auto &x:arr)cin>>x;
#define Vfill(arr)      for(auto &x:arr)for(auto &y:x)cin>>y;
#define Fill(arr)       for(int i =0;i<n;i++){cin>>arr[i].first>>arr[i].second;}


#define all(x)          begin(x), end(x)
#define unik(vec)       vec.resize(unique(all(vec)) - vec.begin());
#define unikSort(vec)   sort(all(vec));vec.resize(unique(all(vec)) - vec.begin());

#define vi              vector<int>
#define pii              pair<int,int>
#define N               n
#define vvi             vector<vector<int>>
#define pii             pair<int,int>
#define pci             pair<char,int>
#define psi             pair<string,int>
#define mii             map<int,int>
#define msi             map<string,int>
#define mci             map<char,int>
#define vii             vector<pair<int,int>>

#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>

#define vprint(arr)     for(auto &x:arr)cout<<x<<" "; 
#define Vprint(arr)     for(auto &x:arr){for(auto &y:x)cout<<y<<" ";cout<<endl;}
#define sprint(arr)     for(auto &x:arr)cout<<x;cout<<endl;
#define Sprint(arr)     for(auto &x:arr){for(auto y:x)cout<<y;cout<<endl;}

inline int in(){int x;cin >> x;return x;}inline string sin(){string x;cin >> x;return x;}inline char chin(){char x;cin >> x;return x;}inline int In(){int x;cin >> x;return x;}
// ==========================================================================================================
long long binpow(long long a, long long b) {if (b == 0)return 1;long long res = binpow(a, b / 2);if (b % 2)return res * res * a;else return res * res;}
// long long binpowMOD(long long a, long long b, long long m) {a %= m;long long res = 1;while (b > 0) {if (b & 1)res = res * a % m;a = a * a % m;b >>= 1;}return res;}
// ==========================================================================================================

// int powm(int a, int b, int mod) { int res = 1; while (b > 0) { if (b & 1)res = (res * a) % mod; a = (a * a) % mod; b = b >> 1; } return res; }  //power modulo m
// void extendgcd(int a, int b, int* v) { if (b == 0) { v[0] = 1; v[1] = 0; v[2] = a; return; } extendgcd(b, a % b, v); int x = v[1]; v[1] = v[0] - v[1] * (a / b); v[0] = x; return; } //pass an array of size 3
// int mminv(int a, int b) { int arr[3]; extendgcd(a, b, arr); return arr[0]; } //for non prime b
// int mminvprime(int a, int b) { if (a % b == 0) return -1; return powm(a, b - 2, b); } //for prime only
// const int SIZE = 10005; 
// int fact[SIZE], ifact[SIZE];
// void gen_factorial(int n, int mod) { fact[0] = fact[1] = ifact[0] = ifact[1] = 1; for (int i = 2; i <= n; i++) { fact[i] = (i * fact[i - 1]) % mod; } ifact[n] = mminvprime(fact[n], mod); for (int i = n - 1; i >= 2; i--) { ifact[i] = ((i + 1) * ifact[i + 1]) % mod; } }
// int choose(int n, int r, int m) { int val1 = fact[n]; int val2 = ifact[n - r]; int val3 = ifact[r]; return (((val1 * val2) % m) * val3) % m; } 

// be careful with mod subtraction - if it is negative than add mod.
// go for another approach
// time complexity
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
vector<string>arr;
int depth[4005][4005];
bool in(int x, int y, int n, int m){
    return (x>=0&&x<n&&y>=0&&y<m && arr[x][y]!='.');
}
void solve(int xx){	 
    int n I,m I;
    arr.resize(n);vfill(arr);
    
    deque<pii>q;
    int ans = 1;
    q.push_back({0,0});
    depth[0][0]=1;

    while(!q.empty()){

        int x=q.front().first,y=q.front().second;
        q.pop_front();
        ans = max(ans,depth[x][y]);

        rep(i,0,4){

            int newx=x+dx[i];
            int newy=y+dy[i];


            if(in(newx,newy,n,m)&&depth[newx][newy]==0){
                if(arr[x][y]!=arr[newx][newy]){
                    q.push_back({newx,newy});
                    depth[newx][newy]=depth[x][y]+1;
                }else{
                    q.push_front({newx,newy});
                    depth[newx][newy]=depth[x][y];
                }
            }
        }
    }
   
    cout<<ans<<endl;


}

// =======================================================================================================
signed main(){
    IOS;
    int t =1,xx=0 ;
    // cin>>t;
    while (t--){solve(xx++);}return 0;
}
// =======================================================================================================

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...