๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/11660
๋ฌธ์ ์์ฝ
NรN๊ฐ์ ์๊ฐ NรN ํฌ๊ธฐ์ ํ์ ์ฑ์์ ธ ์๋ค. (x1, y1)๋ถํฐ (x2, y2)๊น์ง ํฉ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. (x, y)๋ xํ y์ด์ ์๋ฏธํ๋ค.
์๋ฅผ ๋ค์ด, N = 4์ด๊ณ , ํ๊ฐ ์๋์ ๊ฐ์ด ์ฑ์์ ธ ์๋ ๊ฒฝ์ฐ๋ฅผ ์ดํด๋ณด์.
์ฌ๊ธฐ์ (2, 2)๋ถํฐ (3, 4)๊น์ง ํฉ์ ๊ตฌํ๋ฉด 3+4+5+4+5+6 = 27์ด๊ณ , (4, 4)๋ถํฐ (4, 4)๊น์ง ํฉ์ ๊ตฌํ๋ฉด 7์ด๋ค.
ํ์ ์ฑ์์ ธ ์๋ ์์ ํฉ์ ๊ตฌํ๋ ์ฐ์ฐ์ด ์ฃผ์ด์ก์ ๋, ์ด๋ฅผ ์ฒ๋ฆฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
๋ฌธ์ ํ์ด
์ฒ์์๋ ๋ฌธ์ ๋ฅผ ์๋ชป ์ดํดํด์ ํด๋น ๋ฒ์์ ๋ํด์๋ง ํฉ์ ๊ตฌํด์ฃผ๋ ค๊ณ ํ์๋ค.
๊ทธ๋ ๊ฒ ๋๋ฉด ๋งค๋ฒ ๊ณ์ฐ์ ํด์ฃผ๊ฒ ๋์ด ์๊ฐ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ค.
๋ณดํต ์ด๋ด ๋ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ค๋ฉด ๋๋ถ๋ถ ๋์ ํ๋ก๊ทธ๋๋ฐ์ ํตํด ํ์ด์ฃผ๋ฉด ๋๋ค๊ณ ์๊ฐํ๊ณ ์ด๋ป๊ฒ ํ์ด์ผํ ์ง ๊ณ ๋ฏผ์ ๋ง์ด ํ๋ค.
๋งค ๋ฒ ์ฒ์๋ถํฐ ๋ชจ๋ ์ซ์๋ฅผ ๋ํด ํฉ์ ๊ตฌํด์ค ์ ์๊ธฐ ๋๋ฌธ์ ์ด์ ์ ๊ตฌํ ํฉ์ ํตํด์ ๋ค์ ํฉ์ ๊ตฌํด์ฃผ์ด์ผ ํ๋ค.
์๋ฅผ ๋ค์ด, (1, 1) ๋ถํฐ (3, 3) ๊น์ง ๊ตฌํ๋ค๊ณ ํ์ ๋ (1, 1) ๋ถํฐ (1, 2) ์ ํฉ์ ๊ตฌํ๊ณ (1, 1) ๋ถํฐ (1, 3) ์ ํฉ์ ๊ตฌํด์ ๋ชจ๋ ํฉ์ ๋ค ๊ตฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ ์ ๋ฐ์ ์๋ค. ๊ทธ๋์ ์ด์ ์ ๊ตฌํ ํฉ์ ์ ์ฅํ๊ณ ๋ค์ ํฉ์ ๊ตฌํ ๋ ์ฌ์ฉํด์ผ ํ๋ค.
๊ทธ๋์ ๋ค์๊ณผ ๊ฐ์ด ์ ํ์์ ํตํด ๋ชจ๋ ์์น์์์ ๋์ ํฉ์ ๊ตฌํด์ฃผ์๋ค.
dp = [[0] * (n+1) for _ in range(n+1)]
for i in range(1, n+1):
for j in range(1, n+1):
dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] + graph[i-1][j-1]
์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ ํ์์ ์ํด์ ๋์ ํฉ์ด ๊ณ์ฐ๋๋ค.
dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] + graph[i-1][j-1]
๋ง์ฝ ์๋ฅผ ๋ค์ด, ์ ํ์์ ํตํด (3, 3) ์ ํฉ์ ๊ตฌํ๋ ค๊ณ ํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํ ์ ์๋ค.
์ด๋ ๊ฒ ๋ชจ๋ ์์น์์์ ๋์ ํฉ์ ๊ตฌํด์ค๋ค. ๋ฐ๋ผ์, ๋ค์๊ณผ ๊ฐ์ด ๋ชจ๋ ๋์ ํฉ์ด ๊ตฌํด์ง๋ค.
๋ค์์ผ๋ก ์ํ๋ ๋ฒ์์ ๋์ ํฉ์ ๊ตฌํ๊ณ ์ถ๋ค๋ฉด ์ด์ ์ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํ ์ ์๋ค.
if x1 == x2 and y1 == y2:
result = graph[x1-1][y1-1]
else:
if x1 == 1:
result = dp[x2][y2] - dp[x2][y1-1]
elif y1 == 1:
result = dp[x2][y2] - dp[x1-1][y2]
else:
result = dp[x2][y2] - (dp[x1-1][y2] + dp[x2][y1-1] - dp[x1-1][y1-1])
์ด๋ ๊ฒ ๊ตฌํ ์ด์ ๋ ์์์ ๊ตฌํ ๋ฐฉ์๊ณผ ์ ์ฌํ๊ฒ ๊ตฌํ๋ค๊ณ ๋ณผ ์ ์๋๋ฐ ์๋ฅผ ๋ค์ด์ ์ค๋ช ํด๋ณด์.
์๋ฅผ ๋ค์ด, (2, 2) ์์ (3, 4) ๊น์ง์ ํฉ์ ๊ตฌํ๊ณ ์ถ๋ค๊ณ ํด๋ณด์.
๋ ๋ค๋ฅธ ์๋ก (3, 3) ์์ (4, 4) ๊น์ง์ ํฉ์ ๊ตฌํ๊ณ ์ถ๋ค๊ณ ํด๋ณด์.
์ด๋ ๊ฒ ๋์ ํฉ์ ํตํด์ ํน์ ๋ฒ์์ ๋์ ํฉ์ ๊ตฌํด์ค ์ ์๋ค.
์ ์ถ ๋ต์
import sys
n, m = map(int, sys.stdin.readline().split())
graph = []
for i in range(n):
graph.append(list(map(int, sys.stdin.readline().split())))
dp = [[0] * (n+1) for _ in range(n+1)]
for i in range(1, n+1):
for j in range(1, n+1):
dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] + graph[i-1][j-1]
for _ in range(m):
x1, y1, x2, y2 = map(int, sys.stdin.readline().split())
if x1 == x2 and y1 == y2:
result = graph[x1-1][y1-1]
else:
if x1 == 1:
result = dp[x2][y2] - dp[x2][y1-1]
elif y1 == 1:
result = dp[x2][y2] - dp[x1-1][y2]
else:
result = dp[x2][y2] - (dp[x1-1][y2] + dp[x2][y1-1] - dp[x1-1][y1-1])
print(result)