# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
42878 | kinssang | 보물 찾기 (CEOI13_treasure2) | C++14 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
int sum[105][105];
bool check[105][105];
void proc(int r1, int r2, int c1, int c2, int ans)
{
if (r1 == 1 && c1 == 1)
{
sum[r2][c2] = ans;
check[r2][c2] = true;
}
if (ans == 0)
{
for (int i = r1; i <= r2; i++)
{
for (int j = c1; j <= c2; j++)
{
sum[i][j] = sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1];
check[i][j] = true;
}
}
}
else if (ans == (r2 - r1 + 1)*(c2 - c1 + 1))
{
for (int i = r1; i <= r2; i++)
{
for (int j = c1; j <= c2; j++)
{
sum[i][j] = sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1] + 1;
check[i][j] = true;
}
}
}
else
{
if (!check[(r1+r2)/2][(c1+c2)/ 2])
{
sum[(r1+r2)/2][(c1+c2)/2] = ((r1+r2)/2 == 0 || (c1+c2)/2 == 0) ? 0 : countTreasure(1, 1,(r1+r2)/2, (c1+c2)/2);
check[(r1+r2)/2][(c1+c2)/2] = true;
}
if (!check[r2][(c1+c2)/2])
{
sum[r2][(c1+c2)/2] = (r2 == 0 || (c1+c2)/2 == 0) ? 0 : countTreasure(1, 1, r2, (c1+c2)/2);
check[r2][(c1+c2)/2] = true;
}
if (!check[(r1+r2)/2][c2])
{
sum[(r1+r2)/2][c2] = ((r1+r2)/2 == 0 || c2 == 0) ? 0 : countTreasure(1, 1, (r1+r2)/2, c2);
check[(r1+r2)/2][c2] = true;
}
if(r1 <= (r1+r2)/2 && c1 <= (c1+c2)/2) proc(r1, (r1+r2)/ 2, c1, (c1+c2)/2, sum[(r1+r2)/2][(c1+c2)/2] - sum[r1-1][(c1+c2)/2] - sum[(r1+r2)/2][c1-1] + sum[r1-1][c1-1]);
if((r1+r2)/2+1 <= r2 && c1 <= (c1+c2)/2) proc((r1+r2)/2+1, r2, c1, (c1+c2)/2, sum[r2][(c1+c2)/2] - sum[(r1+r2)/2][(c1+c2)/2] - sum[r2][c1-1] + sum[(r1+r2)/2][c1-1]);
if(r1 <= (r1+r2)/2 && (c1+c2)/2+1 <= c2) proc(r1, (r1+r2)/2, (c1+c2)/2+1, c2, sum[(r1+r2)/2][c2] - sum[(r1+r2)/2][(c1+c2)/2] - sum[r1-1][c2] + sum[r1-1][(c1+c2)/2]);
if((r1+r2)/2+1 <= r2 && (c1+c2)/2+1 <= c2) proc((r1+r2)/2+1, r2, (c1+c2)/2+1, c2, sum[r2][c2] - sum[r2][(c1+c2)/2] - sum[(r1+r2)/2][c2] + sum[(r1+r2)/2][(c1+c2)/2]);
}
}
void findTreasure(int N)
{
for (int i = 0; i < 105; i++) check[0][i] = true;
for (int i = 1; i < 105; i++) check[i][0] = true;
int cnt = countTreasure(1, 1, N, N);
proc(1, N, 1, N, cnt);
for (int i = 1; i <= N; i++)
{
for (int j = 1; j <= N; j++)
{
if (sum[i][j] - sum[i][j - 1] - sum[i - 1][j] + sum[i - 1][j - 1] == 1) Report(i, j);
}
}
}