[๋ฐฑ์ค 11660 ๐ฅ] ๊ตฌ๊ฐ ํฉ ๊ตฌํ๊ธฐ 5
https://www.acmicpc.net/problem/11660
11660๋ฒ: ๊ตฌ๊ฐ ํฉ ๊ตฌํ๊ธฐ 5
์ฒซ์งธ ์ค์ ํ์ ํฌ๊ธฐ N๊ณผ ํฉ์ ๊ตฌํด์ผ ํ๋ ํ์ M์ด ์ฃผ์ด์ง๋ค. (1 ≤ N ≤ 1024, 1 ≤ M ≤ 100,000) ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ํ์ ์ฑ์์ ธ ์๋ ์๊ฐ 1ํ๋ถํฐ ์ฐจ๋ก๋๋ก ์ฃผ์ด์ง๋ค. ๋ค์ M๊ฐ์ ์ค์๋ ๋ค
www.acmicpc.net
๋ฌธ์
N×N๊ฐ์ ์๊ฐ N×N ํฌ๊ธฐ์ ํ์ ์ฑ์์ ธ ์๋ค. (x1, y1)๋ถํฐ (x2, y2)๊น์ง ํฉ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. (x, y)๋ xํ y์ด์ ์๋ฏธํ๋ค.
์๋ฅผ ๋ค์ด, N = 4์ด๊ณ , ํ๊ฐ ์๋์ ๊ฐ์ด ์ฑ์์ ธ ์๋ ๊ฒฝ์ฐ๋ฅผ ์ดํด๋ณด์.
1 | 2 | 3 | 4 |
2 | 3 | 4 | 5 |
3 | 4 | 5 | 6 |
4 | 5 | 6 | 7 |
์ฌ๊ธฐ์ (2, 2)๋ถํฐ (3, 4)๊น์ง ํฉ์ ๊ตฌํ๋ฉด 3+4+5+4+5+6 = 27์ด๊ณ , (4, 4)๋ถํฐ (4, 4)๊น์ง ํฉ์ ๊ตฌํ๋ฉด 7์ด๋ค.
ํ์ ์ฑ์์ ธ ์๋ ์์ ํฉ์ ๊ตฌํ๋ ์ฐ์ฐ์ด ์ฃผ์ด์ก์ ๋, ์ด๋ฅผ ์ฒ๋ฆฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ํ์ ํฌ๊ธฐ N๊ณผ ํฉ์ ๊ตฌํด์ผ ํ๋ ํ์ M์ด ์ฃผ์ด์ง๋ค. (1 ≤ N ≤ 1024, 1 ≤ M ≤ 100,000) ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ํ์ ์ฑ์์ ธ ์๋ ์๊ฐ 1ํ๋ถํฐ ์ฐจ๋ก๋๋ก ์ฃผ์ด์ง๋ค. ๋ค์ M๊ฐ์ ์ค์๋ ๋ค ๊ฐ์ ์ ์ x1, y1, x2, y2 ๊ฐ ์ฃผ์ด์ง๋ฉฐ, (x1, y1)๋ถํฐ (x2, y2)์ ํฉ์ ๊ตฌํด ์ถ๋ ฅํด์ผ ํ๋ค. ํ์ ์ฑ์์ ธ ์๋ ์๋ 1,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค. (x1 ≤ x2, y1 ≤ y2)
์ถ๋ ฅ
์ด M์ค์ ๊ฑธ์ณ (x1, y1)๋ถํฐ (x2, y2)๊น์ง ํฉ์ ๊ตฌํด ์ถ๋ ฅํ๋ค.
๋ฌธ์ ํ์ด
- ๊ฐ ์์น๋ณ๋ก (1,1)์์ ์์ํด์ (i,j) ๊น์ง์ ๋ถ๋ถํฉ์ partSum[i][j]์ ์ ์ฅํด์ค๋ค.
- ์ฒ์์ partSum์ ์ ๋ ฅ๋ฐ์ ์ ์ ๋ณด๋ก ์ด๊ธฐํํด์ค๋ค.
- 2์ค for๋ฌธ์ ์ด์ฉํด์ ๊ฐ ์์น๋ณ๋ก ํ์ฌ ์์น ๊ธฐ์ค ์ผ์ชฝ์ ์์นํ๋ partSum ๊ฐ๊ณผ ์์ชฝ์ ์์นํ๋ partSum ๊ฐ์ ๋ํด์ฃผ๊ณ , ์ค๋ณตํด์ ๋ํด์ง ๋๊ฐ์ ์์ชฝ ๋ฐฉํฅ์ partSum๊ฐ์ ๋นผ์ฃผ๋ฉด ๋๋ค.
- ๋ถ๋ถํฉ 2์ฐจ์ ๋ฐฐ์ด์ ๋ชจ๋ ๊ตฌํ์ผ๋ฉด ๋จ์ ๊ณ์ฐ์ผ๋ก ์ ๋ต์ ๊ตฌํด์ค ์ ์๋ค! ์ด ์ค๋ช ์ ๊ทธ๋ฆผ์ด ๋ ์ดํดํ๊ธฐ ์ฌ์ธ ๊ฒ ๊ฐ์์ ๋ค์ ๊ทธ๋ฆผ์ผ๋ก ์ค๋ช ํ๊ฒ ๋ค!
์ฐ๋ฆฌ๋ ์ฐ๋ณด๋ผ์ ๋ถ๋ถ์ ํฉ์ ๊ตฌํด์ผ ํ๋ค๊ณ ๊ฐ์ ํ๋ฉด, (1,1)~(x2,y2) ๊น์ง์ ๋ถ๋ถํฉ์์ (1,1)~(x1-1, y2) ๋ถ๋ถํฉ๊ณผ (1,1)~(x2,y1-1) ๋ถ๋ถํฉ์ ๋นผ์ฃผ๊ณ , ๋ถ๋ถํฉ์ ๋นผ์ฃผ๋ ๊ณผ์ ์์ ์ค๋ณตํด์ ๋นผ์ง (1,1)~(x1-1,y1-1) ๋ถ๋ถํฉ์ ๋ํด์ฃผ๋ฉด ๋๋ค.
import sys
n,m=map(int, sys.stdin.readline().split(' '))
numbers=[[0]+list(map(int, sys.stdin.readline().split(' '))) for _ in range(n)]
numbers.insert(0,[0]*(n+1))
# ๊ฐ ์์น๋ณ ๋ถ๋ถํฉ ๊ตฌํ๊ธฐ
partSum=[x[:] for x in numbers]
for i in range(1,n+1):
for j in range(1,n+1):
partSum[i][j]+=partSum[i][j-1]+partSum[i-1][j]-partSum[i-1][j-1]
for _ in range(m):
x1,y1,x2,y2=map(int, sys.stdin.readline().split(' '))
# (x1, y1)๊ณผ (x2, y2)๊น์ง์ ํฉ์ ๊ตฌํ๋ผ
ans=partSum[x2][y2]-partSum[x1-1][y2]-partSum[x2][y1-1]+partSum[x1-1][y1-1]
print(ans)