제출 #834945

#제출 시각아이디문제언어결과실행 시간메모리
834945maomao90바이러스 (JOI19_virus)C++17
0 / 100
2069 ms7532 KiB
// Hallelujah, praise the one who set me free // Hallelujah, death has lost its grip on me // You have broken every chain, There's salvation in your name // Jesus Christ, my living hope #include <bits/stdc++.h> using namespace std; #define REP(i, s, e) for (int i = (s); i < (e); i++) #define RREP(i, s, e) for (int i = (s); i >= (e); i--) template <class T> inline bool mnto(T& a, T b) {return a > b ? a = b, 1 : 0;} template <class T> inline bool mxto(T& a, T b) {return a < b ? a = b, 1: 0;} typedef unsigned long long ull; typedef long long ll; typedef long double ld; #define FI first #define SE second typedef pair<int, int> ii; typedef pair<ll, ll> pll; typedef tuple<int, int, int> iii; #define ALL(_a) _a.begin(), _a.end() #define SZ(_a) (int) _a.size() #define pb push_back typedef vector<int> vi; typedef vector<ll> vll; typedef vector<ii> vii; typedef vector<iii> viii; #ifndef DEBUG #define cerr if (0) cerr #endif const int INF = 1000000005; const ll LINF = 1000000000000000005ll; const int MAXN = 200005; const int MAXR = 805; const int diri[] = {-1, 0, 1, 0}, dirj[] = {0, 1, 0, -1}; int key[500]; int n, r, c; string s; int a[MAXN]; int g[MAXR][MAXR]; int gap[1 << 4]; bool vis[MAXR][MAXR]; int st[MAXR][MAXR]; int ans, ansc; int main() { #ifndef DEBUG ios::sync_with_stdio(0), cin.tie(0); #endif key['N'] = 0, key['E'] = 1, key['S'] = 2, key['W'] = 3; cin >> n >> r >> c; cin >> s; REP (i, 1, r + 1) { REP (j, 1, c + 1) { cin >> g[i][j]; } } REP (i, 0, n) { a[i] = key[s[i]]; } REP (i, n, 2 * n) { a[i] = a[i - n]; } REP (msk, 0, 1 << 4) { REP (l, 0, n) { int r = l; while (r - l < n && (msk >> a[r] & 1)) { r++; } if (r - l == n) { gap[msk] = INF; break; } mxto(gap[msk], r - l); l = r; } cerr << msk << ": " << gap[msk] << '\n'; } ans = INF; REP (i, 1, r + 1) { REP (j, 1, c + 1) { if (g[i][j] == 0) { continue; } vis[i][j] = 1; queue<ii> qu; qu.push({i, j}); int cnt = 0; vii stk; while (!qu.empty()) { auto [ui, uj] = qu.front(); qu.pop(); stk.pb({ui, uj}); cnt++; REP (k, 0, 4) { int vi = ui + diri[k], vj = uj + dirj[k]; if (g[vi][vj] == 0 || vis[vi][vj]) { continue; } st[vi][vj] |= 1 << (k ^ 2); if (g[vi][vj] <= gap[st[vi][vj]]) { vis[vi][vj] = 1; qu.push({vi, vj}); } } } if (mnto(ans, cnt)) { ansc = 0; } if (ans == cnt) { ansc++; } for (auto [ui, uj] : stk) { vis[ui][uj] = st[ui][uj] = 0; } } } cout << ans << '\n' << ansc << '\n'; return 0; }

컴파일 시 표준 에러 (stderr) 메시지

virus.cpp: In function 'int main()':
virus.cpp:66:24: warning: array subscript has type 'char' [-Wchar-subscripts]
   66 |         a[i] = key[s[i]];
      |                        ^
virus.cpp:120:42: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
  120 |                 vis[ui][uj] = st[ui][uj] = 0;
      |                               ~~~~~~~~~~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...