⇒ 일반적인 divide and conquer 방식으로 코드를 작성하면 시간초과가 발생합니다. 이는 시간복잡도가 2^15 * 2^15 정도 나오게 되는데, 이는 약 10억 정도가 되므로 제한 시간안에 답을 구해낼 수는 없습니다.
2021/04/27
2200 KB
0 ms
#include <iostream>
#include <cmath>
int N, r, c;
int cnt;
void io_faster()
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
}
void input()
{
io_faster();
std::cin >> N >> r >> c;
}
void dc(int y, int x, int len)
{
if (y == r && x == c)
return;
if (y <= r && r < y + len/2 && x <= c && c < x + len / 2)
dc(y, x, len / 2);
else if (y <= r && r < y + len / 2 && x + len / 2 <= c && c < x + len)
{
cnt += (std::pow(len / 2, 2));
dc(y, x + len / 2, len / 2);
}
else if (y + len / 2 <= r && r < y + len && x <= c && c < x + len / 2)
{
cnt += 2 * (std::pow(len / 2, 2));
dc(y + len / 2, x , len / 2);
}
else
{
cnt += 3 * (std::pow(len / 2, 2));
dc(y + len / 2, x + len / 2, len / 2);
}
}
void solve()
{
dc(0, 0, std::pow(2, N));
}
void print_val()
{
std::cout << cnt;
}
int main()
{
input();
solve();
print_val();
return (0);
}