Submission #529741

#TimeUsernameProblemLanguageResultExecution timeMemory
529741c28dnv9q3Nautilus (BOI19_nautilus)C++17
100 / 100
43 ms400 KiB
#include <cstdio> #include <iostream> #define DEBUG if(false) const int N_MAX = 512; const int M_MAX = 5005; int R, C, M; uint64_t map[4096]; uint64_t cur[2][4096]; void printcur(int k) { for (int i = 0; i <= R + 1; i++) { for (int j = 0; j <= C + 1; j++) { putchar((cur[k][i*8 + j/64] & (1ULL << (j%64))) ? '#' : '.'); } putchar('\n'); } putchar('\n'); } int main() { std::cin >> R >> C >> M; for (int i = 0; i < R; i++) { std::string s; std::cin >> s; for (int j = 0; j < C; j++) { if (s[j] == '.') { map[(i+1)*8 + (j+1)/64] |= 1ULL << ((j+1) % 64); } } } /*for (int i = 0; i < R + 2; i++) { map[i][0] = false; map[i][C+1] = false; } for (int j = 0; j < C + 2; j++) { map[0][j] = false; map[R+1][j] = false; }*/ int k = 0; for (int i = 0; i < 4096; i++) { cur[k][i] = map[i]; } DEBUG printf("Map at beginning\n"); DEBUG printcur(k); std::string instr; std::cin >> instr; for (int i = 0; i < instr.size(); i++) { char c = instr[i]; k = 1-k; DEBUG printf("INSTRUCTION %c (k=%d)\n", c, k); switch (c) { case 'N': for (int i = 8; i < 4096-8; i++) { cur[k][i] = cur[1-k][i+8] & map[i]; } break; case 'E': for (int i = 8; i < 4096-8; i++) { uint64_t main = cur[1-k][i] << 1ULL; main &= ~1ULL; main |= (cur[1-k][i-1] >> 63ULL) & 1ULL; cur[k][i] = main & map[i]; } break; case 'S': for (int i = 8; i < 4096-8; i++) { cur[k][i] = cur[1-k][i-8] & map[i]; } break; case 'W': for (int i = 8; i < 4096-8; i++) { uint64_t main = cur[1-k][i] >> 1ULL; main &= ~(1ULL << 63ULL); main |= (cur[1-k][i+1] & 1ULL) << 63ULL; cur[k][i] = main & map[i]; } break; case '?': for (int i = 8; i < 4096-8; i++) { uint64_t m = 0; m |= cur[1-k][i+8]; m |= cur[1-k][i-8]; { uint64_t main = cur[1-k][i] << 1ULL; main &= ~1ULL; main |= (cur[1-k][i-1] >> 63ULL) & 1ULL; m |= main; } { uint64_t main = cur[1-k][i] >> 1ULL; main &= ~(1ULL << 63ULL); main |= (cur[1-k][i+1] & 1ULL) << 63ULL; m |= main; } cur[k][i] = m & map[i]; } break; } DEBUG printcur(k); } int num = 0; for (int i = 0; i < 4096; i++) { for (int j = 0; j < 64; j++) { num += (cur[k][i] & (1ULL << j)) ? 1 : 0; } } std::cout << num << std::endl; }

Compilation message (stderr)

nautilus.cpp: In function 'int main()':
nautilus.cpp:56:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   56 |   for (int i = 0; i < instr.size(); i++) {
      |                   ~~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...