Submission #389550

#TimeUsernameProblemLanguageResultExecution timeMemory
389550jjang36524Robots (APIO13_robots)C++14
100 / 100
803 ms98312 KiB
#include <iostream> #include <algorithm> #include <string.h> #include <queue> using namespace std; #define itn int pair<short, short>lastp[501][501][4]; int dp[45][501][501]; char arr[501][501]; int dx[4] = { -1,0,1,0 }; int dy[4] = { 0,1,0,-1 }; int N, M, K; int isv(int n, int m) { return (n < 0) || (n >= N) || (m < 0) || (m >= M) || (arr[n][m] == 'x'); } int ge(int n, int m) { int ans = m - n; int i; for (i = 0; i < n; i++) ans += K - i; return ans; } pair<int, int> findne(int n, int m, int c) { if (lastp[n][m][c].first != -1) return lastp[n][m][c]; lastp[n][m][c] = { -2,-2 }; if (isv(n, m)) { return lastp[n][m][c]; } int on = n; int om = m; int oc = c; if (arr[n][m] == 'A') c--; if (arr[n][m] == 'C') c++; c += 4; c %= 4; n += dx[c]; m += dy[c]; if (isv(n, m)) { return lastp[on][om][oc] = { on,om }; } return lastp[on][om][oc] = findne(n, m, c); } vector<pair<short, short>>co[300100]; int vis[501][501]; int main() { memset(lastp, -1, sizeof(lastp)); memset(dp, 1, sizeof(dp)); ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> K >> M >> N; int i, j, k, l, m; for (i = 0; i < N; i++) { cin >> arr[i]; } for (i = 0; i < N; i++) { for (j = 0; j < M; j++) { if (arr[i][j] >= '0' && arr[i][j] <= '9') { dp[ge(arr[i][j] - '1', arr[i][j] - '1')][i][j] = 0; } for (k = 0; k < 4; k++) findne(i, j, k); } } int ans = 123456789; for (i = 0; i < K; i++) { int j; for (j = 0; j < K - i; j++) { memset(vis, 0, sizeof(vis)); int s = j; int e = j + i; for (k = 0; k <= N * M; k++) { co[k].clear(); } for (k = s; k < e; k++) { for (l = 0; l < N; l++) { for (m = 0; m < M; m++) { dp[ge(s, e)][l][m] = min((int)dp[ge(s, e)][l][m], dp[ge(s, k)][l][m] + dp[ge(k + 1, e)][l][m]); if (i == K - 1) ans = min(ans, (int)dp[ge(s, e)][l][m]); } } } for (l = 0; l < N; l++) { for (m = 0; m < M; m++) { if (dp[ge(s, e)][l][m] <= N * M) co[dp[ge(s, e)][l][m]].push_back({ l,m }); } } for (k = 0; k <= N * M; k++) { int l; for (l = 0; l < co[k].size(); l++) { if (co[k][l].first < 0 || vis[co[k][l].first][co[k][l].second]) continue; dp[ge(s, e)][co[k][l].first][co[k][l].second] = k; if (i == K - 1) ans = min(ans, k); vis[co[k][l].first][co[k][l].second] = 1; for (m = 0; m < 4; m++) { co[k + 1].push_back(lastp[co[k][l].first][co[k][l].second][m]); } } } } } if (ans > N * M) cout << -1; else cout << ans; }

Compilation message (stderr)

robots.cpp: In function 'int main()':
robots.cpp:113:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<short int, short int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  113 |     for (l = 0; l < co[k].size(); l++)
      |                 ~~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...