답안 #489755

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
489755 2021-11-24T10:26:01 Z AA_Surely 바이러스 (JOI19_virus) C++14
14 / 100
52 ms 10820 KB
#include <bits/stdc++.h>

#define FOR(i,x,n) 	for(int i=x; i<n; i++)
#define F0R(i,n) 	FOR(i,0,n)
#define ROF(i,x,n) 	for(int i=n-1; i>=x; i--)
#define R0F(i,n) 	ROF(i,0,n)

#define WTF 		cout << "WTF" << endl

#define IOS 		ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define F 			first
#define S	 		second
#define pb 			push_back

#define ALL(x) 		x.begin(), x.end()
#define RALL(x) 	x.rbegin(), x.rend()

using namespace std;
typedef long long 		LL;

typedef pair<int, int> 	PII;
typedef pair<LL, LL> 	PLL;

typedef vector<int> 	VI;
typedef vector<LL> 		VLL;
typedef vector<PII> 	VPII;
typedef vector<PLL> 	VPLL;

const int MAXN = 800 + 7;
const int ALPHA = 40;
const int INF = 1e9 + 7;
const int MOD = 1e9 + 7;
const int LOG = 22;

int m, r, c, le, lw;
int ns[MAXN][MAXN], lps[MAXN][MAXN], rps[MAXN][MAXN];
bool effect[MAXN][MAXN][2];
string per;

#define EAST 1
#define WEST 0

int main() {
    IOS;
    cin >> m >> r >> c;
    cin >> per;
    F0R(i, r) F0R(j, c) cin >> ns[i][j];
    per = per + per;
    m <<= 1;

    int ecnt = 0, wcnt = 0;
    F0R(i, m) {
        if (per[i] == 'E') ecnt++;
        else {
            le = max(le, ecnt);
            ecnt = 0;
        }

        if (per[i] == 'W') wcnt++;
        else {
            lw = max(lw, wcnt);
            wcnt = 0;
        }
    }
    le = max(le, ecnt);
    lw = max(lw, wcnt);

    if (le == m) le = INF;
    if (lw == m) lw = INF;

    F0R(i, r) F0R(j, c) {
        effect[i][j][EAST] = (le >= ns[i][j] && ns[i][j] && j < c - 1);
        effect[i][j][WEST] = (lw >= ns[i][j] && ns[i][j] && j);
    }

    F0R(i, r) {
        FOR(j, 1, c) {
            if (!ns[i][j]) continue;
            if (!effect[i][j - 1][EAST]) lps[i][j] = 0;
            else lps[i][j] = lps[i][j - 1] + 1;
        }

        R0F(j, c - 1) {
            if (!ns[i][j]) continue;
            if (!effect[i][j + 1][WEST]) rps[i][j] = 0;
            else rps[i][j] = rps[i][j + 1] + 1;
        }
    }

    int minim = INF, cnt = 1;
    
    /*
    cout << endl << endl << "_-----------------------------_" << endl;
    F0R(i, r) {
        F0R(j, c) cout << lps[i][j] << ' ';
        cout << endl;
    }
    */

    F0R(i, r) F0R(j, c) {
        if (!ns[i][j]) continue;
        if (minim == lps[i][j] + rps[i][j] + 1) cnt++;
        if (minim > lps[i][j] + rps[i][j] + 1) cnt = 1;
        minim = min(minim, lps[i][j] + rps[i][j] + 1);
    }
#define endl '\n'
    cout << minim << endl << cnt << endl;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 620 KB Output is correct
2 Correct 41 ms 10404 KB Output is correct
3 Correct 52 ms 10568 KB Output is correct
4 Correct 36 ms 10280 KB Output is correct
5 Correct 49 ms 10684 KB Output is correct
6 Correct 2 ms 4056 KB Output is correct
7 Correct 39 ms 10820 KB Output is correct
8 Correct 27 ms 7516 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 332 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 620 KB Output is correct
2 Correct 41 ms 10404 KB Output is correct
3 Correct 52 ms 10568 KB Output is correct
4 Correct 36 ms 10280 KB Output is correct
5 Correct 49 ms 10684 KB Output is correct
6 Correct 2 ms 4056 KB Output is correct
7 Correct 39 ms 10820 KB Output is correct
8 Correct 27 ms 7516 KB Output is correct
9 Incorrect 1 ms 332 KB Output isn't correct
10 Halted 0 ms 0 KB -