#include "rainbow.h"
#include <bits/stdc++.h>
using namespace std;
const int N = 200'000;
const int D = 4;
const int DX[D] = {0, 0, -1, 1};
const int DY[D] = {-1, 1, 0, 0};
int n, m, a, b, x1, yyy, x2, y2;
vector<pair<int, int>> path;
vector<char> vecDir = {'W', 'E', 'N', 'S'};
int markSub1[60][60], cnt[3][N + 10], cmpSub2;
int markSub2[3][N + 10], valSub2[N + 10];
void uniquePath() {
sort(path.begin(), path.end());
path.resize(unique(path.begin(), path.end()) - path.begin());
}
bool isSub1() {
return max(n, m) <= 50;
}
bool inPath(int x, int y) {
int idx = lower_bound(path.begin(), path.end(), make_pair(x, y)) - path.begin();
return idx < path.size() && path[idx] == make_pair(x, y);
}
bool inSub(int a, int b) {
bool checkA = (x1 <= a && a <= x2);
bool checkB = (yyy <= b && b <= y2);
return checkA && checkB;
}
void initSub1() {
uniquePath();
}
bool isSub2() {
return n <= 2 && m <= N;
}
bool inGrid(int x, int y) {
return min(x, y) >= 1 && x <= n && y <= m;
}
void dfs2(int i, int j) {
markSub2[i][j] = cmpSub2;
for (int d = 0; d < D; d++) {
int nx = i + DX[d];
int ny = j + DY[d];
if (inGrid(nx, ny) && !inPath(nx, ny) && !markSub2[nx][ny])
dfs2(nx, ny);
}
}
void initSub2() {
uniquePath();
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++) {
cnt[i][j] = cnt[i][j - 1];
if ((j == 1 || inPath(i, j - 1)) && !inPath(i, j))
cnt[i][j]++;
}
for (int j = 1; j <= m; j++) {
for (int i = 1; i <= n; i++)
if (!inPath(i, j) && !markSub2[i][j]) {
cmpSub2++;
dfs2(i, j);
}
valSub2[j] = cmpSub2;
}
}
void init(int R, int C, int sr, int sc, int M, char *S) {
n = R;
m = C;
a = sr;
b = sc;
path.push_back({a, b});
for (int i = 0; i < M; i++) {
int idx;
for (int j = 0; j < D; j++)
if (S[i] == vecDir[j])
idx = j;
int nx = path.back().first + DX[idx];
int ny = path.back().second + DY[idx];
path.push_back({nx, ny});
}
if (isSub1())
initSub1();
else if (isSub2())
initSub2();
}
void dfs(int i, int j) {
markSub1[i][j] = true;
for (int d = 0; d < D; d++) {
int nx = i + DX[d];
int ny = j + DY[d];
if (inSub(nx, ny) && !inPath(nx, ny) && !markSub1[nx][ny])
dfs(nx, ny);
}
}
int solveSub1() {
for (int i = x1; i <= x2; i++)
for (int j = yyy; j <= y2; j++)
markSub1[i][j] = 0;
int ans = 0;
for (int i = x1; i <= x2; i++)
for (int j = yyy; j <= y2; j++)
if (!inPath(i, j) && !markSub1[i][j]) {
ans++;
dfs(i, j);
}
return ans;
}
int solveSub2() {
if (x1 == x2)
return cnt[x2][y2] - cnt[x2][yyy] + (!inPath(x2, yyy));
bool add = false;
for (int i = 1; i <= n; i++)
if (!inPath(i, yyy))
add = true;
return valSub2[y2] - valSub2[yyy] + add;
}
int colour(int ar, int ac, int br, int bc) {
x1 = ar;
yyy = ac;
x2 = br;
y2 = bc;
if (isSub1())
return solveSub1();
if (isSub2())
return solveSub2();
return 0;
}
Compilation message
rainbow.cpp: In function 'bool inPath(int, int)':
rainbow.cpp:27:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
27 | return idx < path.size() && path[idx] == make_pair(x, y);
| ~~~~^~~~~~~~~~~~~
rainbow.cpp: In function 'void init(int, int, int, int, int, char*)':
rainbow.cpp:88:45: warning: 'idx' may be used uninitialized in this function [-Wmaybe-uninitialized]
88 | int ny = path.back().second + DY[idx];
| ~~~~~~^
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
5 ms |
336 KB |
Output is correct |
2 |
Correct |
42 ms |
336 KB |
Output is correct |
3 |
Correct |
46 ms |
760 KB |
Output is correct |
4 |
Correct |
47 ms |
584 KB |
Output is correct |
5 |
Correct |
35 ms |
336 KB |
Output is correct |
6 |
Correct |
1 ms |
336 KB |
Output is correct |
7 |
Correct |
1 ms |
336 KB |
Output is correct |
8 |
Correct |
1 ms |
336 KB |
Output is correct |
9 |
Correct |
1 ms |
336 KB |
Output is correct |
10 |
Correct |
1 ms |
336 KB |
Output is correct |
11 |
Correct |
38 ms |
336 KB |
Output is correct |
12 |
Correct |
47 ms |
336 KB |
Output is correct |
13 |
Correct |
69 ms |
532 KB |
Output is correct |
14 |
Correct |
58 ms |
336 KB |
Output is correct |
15 |
Correct |
1 ms |
336 KB |
Output is correct |
16 |
Correct |
1 ms |
336 KB |
Output is correct |
17 |
Correct |
1 ms |
336 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
336 KB |
Output is correct |
2 |
Correct |
1 ms |
336 KB |
Output is correct |
3 |
Correct |
131 ms |
22724 KB |
Output is correct |
4 |
Correct |
128 ms |
18620 KB |
Output is correct |
5 |
Correct |
120 ms |
19644 KB |
Output is correct |
6 |
Correct |
124 ms |
24752 KB |
Output is correct |
7 |
Correct |
124 ms |
25580 KB |
Output is correct |
8 |
Correct |
95 ms |
18364 KB |
Output is correct |
9 |
Correct |
119 ms |
18620 KB |
Output is correct |
10 |
Correct |
113 ms |
19644 KB |
Output is correct |
11 |
Correct |
121 ms |
24772 KB |
Output is correct |
12 |
Correct |
86 ms |
18108 KB |
Output is correct |
13 |
Correct |
86 ms |
18620 KB |
Output is correct |
14 |
Correct |
95 ms |
19644 KB |
Output is correct |
15 |
Correct |
103 ms |
24668 KB |
Output is correct |
16 |
Correct |
108 ms |
21440 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
336 KB |
Output is correct |
2 |
Incorrect |
3 ms |
1480 KB |
Output isn't correct |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
5 ms |
336 KB |
Output is correct |
2 |
Correct |
42 ms |
336 KB |
Output is correct |
3 |
Correct |
46 ms |
760 KB |
Output is correct |
4 |
Correct |
47 ms |
584 KB |
Output is correct |
5 |
Correct |
35 ms |
336 KB |
Output is correct |
6 |
Correct |
1 ms |
336 KB |
Output is correct |
7 |
Correct |
1 ms |
336 KB |
Output is correct |
8 |
Correct |
1 ms |
336 KB |
Output is correct |
9 |
Correct |
1 ms |
336 KB |
Output is correct |
10 |
Correct |
1 ms |
336 KB |
Output is correct |
11 |
Correct |
38 ms |
336 KB |
Output is correct |
12 |
Correct |
47 ms |
336 KB |
Output is correct |
13 |
Correct |
69 ms |
532 KB |
Output is correct |
14 |
Correct |
58 ms |
336 KB |
Output is correct |
15 |
Correct |
1 ms |
336 KB |
Output is correct |
16 |
Correct |
1 ms |
336 KB |
Output is correct |
17 |
Correct |
1 ms |
336 KB |
Output is correct |
18 |
Incorrect |
42 ms |
2044 KB |
Output isn't correct |
19 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
5 ms |
336 KB |
Output is correct |
2 |
Correct |
42 ms |
336 KB |
Output is correct |
3 |
Correct |
46 ms |
760 KB |
Output is correct |
4 |
Correct |
47 ms |
584 KB |
Output is correct |
5 |
Correct |
35 ms |
336 KB |
Output is correct |
6 |
Correct |
1 ms |
336 KB |
Output is correct |
7 |
Correct |
1 ms |
336 KB |
Output is correct |
8 |
Correct |
1 ms |
336 KB |
Output is correct |
9 |
Correct |
1 ms |
336 KB |
Output is correct |
10 |
Correct |
1 ms |
336 KB |
Output is correct |
11 |
Correct |
38 ms |
336 KB |
Output is correct |
12 |
Correct |
47 ms |
336 KB |
Output is correct |
13 |
Correct |
69 ms |
532 KB |
Output is correct |
14 |
Correct |
58 ms |
336 KB |
Output is correct |
15 |
Correct |
1 ms |
336 KB |
Output is correct |
16 |
Correct |
1 ms |
336 KB |
Output is correct |
17 |
Correct |
1 ms |
336 KB |
Output is correct |
18 |
Incorrect |
42 ms |
2044 KB |
Output isn't correct |
19 |
Halted |
0 ms |
0 KB |
- |