제출 #387524

#제출 시각아이디문제언어결과실행 시간메모리
387524mohamedsobhi777바이러스 (JOI19_virus)C++14
0 / 100
420 ms8940 KiB
#include <bits/stdc++.h>

using namespace std;

#define vi vector<int>
#define vll vector<ll>
#define vii vector<pair<int, int>>
#define pii pair<int, int>
#define pll pair<ll, ll>
#define loop(_) for (int __ = 0; __ < (_); ++__)
#define pb push_back
#define f first
#define s second
#define sz(_) ((int)_.size())
#define all(_) _.begin(), _.end()
#define lb lower_bound
#define ub upper_bound

using ll = long long;
using ld = long double;

const int N = 800 + 7;
const ll mod = 1e9 + 7;

int n, m, k, Min, Cnt;
int a[N][N], b[N][N];
int mov[100000 + 8];
string st;
int col;
int viz[N][N];
int m1[4] = {1, -1, 0, 0}, m2[4] = {0, 0, 1, -1};
int mask[16] ;

bool chk(int A, int B)
{
       int msk = 0 ; 
       for (int j = 0 ;j < 4; ++ j){
              int nx = A + m1[j] ; 
              int ny = B + m2[j] ; 
              if(nx >= 0 &&nx < n && ny >= 0 && ny < m && viz[nx][ny] == col){
                     msk|=(1<<j) ; 
              }
       }
       return mask[msk] >= a[A][B];
}

int get(vi arr){
       int best = 0;
       int sum = 0;
       for (int i = 0; i < k; ++i)
       {
              if (!arr[i])
                     break;
              best++;
       }
       for (int i = k - 1; ~i; --i)
       {
              if (!arr[i])
                     break;
              best++;
       }

       for (int i = 0; i < k; ++i)
       {
              if (!arr[i])
              {
                     best = max(best, sum);
                     sum = 0;
              }
              else
                     ++sum;
       }
       best = max(best, sum);
       return best; 
}

int solve(int x, int y)
{
       ++col;
       queue<pii> qu;
       qu.push({x, y});
       int ret = 1;

       viz[x][y] = col;

       while (sz(qu))
       {
              int A = qu.front().f;
              int B = qu.front().s;
              qu.pop();

              for (int j = 0; j < 4; ++j)
              {
                     int nx = A + m1[j];
                     int ny = B + m2[j];
                     if (nx >= 0 && nx < n && ny >= 0 && ny < m)
                     {
                            if (viz[nx][ny] != col && a[nx][ny] != 0 && chk(nx, ny))
                            {
                                   qu.push({nx, ny});
                                   ++ret;
                                   viz[nx][ny] = col;
                            }
                     }
              }
       }
       return ret;
}

int main()
{
       ios_base::sync_with_stdio(0);
       cin.tie(0);
#ifndef ONLINE_JUDGE
#endif
       cin >> k >> n >> m;
       cin >> st;
       for (int i = 0; i < k; ++i)
       {
              if (st[i] == 'S')
                     mov[i] = 0;
              else if (st[i] == 'N')
                     mov[i] = 1;
              else if (st[i] == 'W')
                     mov[i] = 3;
              else
                     mov[i] = 2;
       }

       for(int i = 0 ;i < (1<<4) ;++ i){
              vi arr(k,0) ; 
              for(int j= 0 ;j < k ;++ j){
                     arr[j] = (i&(1<<mov[j])) ; 
              }
              mask[i] = get(arr) ; 
       }

       for (int i = 0; i < n; ++i)
       {
              for (int j = 0; j < m; ++j)
              {
                     cin >> a[i][j];
              }
       }

       Min = 1e9;
       for (int i = 0; i < n; ++i)
       {
              for (int j = 0; j < m; ++j)
              {
                     if (!a[i][j])
                            continue;
                     int an = solve(i, j);
                     if (an < Min)
                     {
                            Min = an, Cnt = 1;
                     }
                     else if (an == Min)
                            ++Cnt;
              }
       }

       cout << Min << "\n";
       cout << Cnt << "\n";
       return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...