문제 링크 : 백준 11660번
범위는 1 ≤ N ≤ 1024, 1 ≤ M ≤ 100,000 이기 때문에 전부 탐색으로 구현하면 최악의 경우 1024 x 1024 x 100,000으로 시간초과가 난다.
따라서 나는 dp를 이용해서 풀었다.
package main
import (
"bufio"
"fmt"
"os"
)
var (
r = bufio.NewReader(os.Stdin)
w = bufio.NewWriter(os.Stdout)
n, m, tmp int
x1, y1, x2, y2 int
dp [1025][1025]int
)
func main() {
defer w.Flush()
fmt.Fscan(r, &n, &m)
for i := 1; i <= n; i++ {
for j := 1; j <= n; j++ {
fmt.Fscan(r, &tmp)
dp[i][j] = dp[i-1][j] + dp[i][j-1] + tmp - dp[i-1][j-1]
// dp[i][j]에 (1, 1)부터 (i, j)까지 합을 저장
}
}
for i := 0; i < m; i++ {
fmt.Fscan(r, &x1, &y1, &x2, &y2)
result := dp[x2][y2] - (dp[x1-1][y2] + dp[x2][y1-1]) + dp[x1-1][y1-1]
fmt.Fprintln(w, result)
}
}