Submission #834958

#TimeUsernameProblemLanguageResultExecution timeMemory
834958maomao90Virus Experiment (JOI19_virus)C++17
6 / 100
287 ms7628 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'; } if (r > 50 && c > 50) { REP (i, 1, r + 1) { REP (j, 1, c + 1) { if (g[i][j] == 0) { continue; } bool bad = 0; REP (k, 0, 4) { int vi = i + diri[k], vj = j + dirj[k]; if (g[vi][vj] == 0 || vis[vi][vj]) { continue; } if (g[vi][vj] <= gap[1 << (k ^ 2)]) { bad = 1; break; } } ansc += !bad; } } assert(ansc); cout << 1 << '\n' << ansc << '\n'; return 0; } ans = INF; REP (i, 1, r + 1) { REP (j, 1, c + 1) { if (g[i][j] == 0) { continue; } memset(vis, 0, sizeof vis); memset(st, 0, sizeof st); vis[i][j] = 1; queue<ii> qu; qu.push({i, j}); int cnt = 0; while (!qu.empty()) { auto [ui, uj] = qu.front(); qu.pop(); 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++; } } } cout << ans << '\n' << ansc << '\n'; return 0; }

Compilation message (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]];
      |                        ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...