์•Œ๊ณ ๋ฆฌ์ฆ˜/DP

[๋ฐฑ์ค€ 11660 ๐Ÿฅˆ] ๊ตฌ๊ฐ„ ํ•ฉ ๊ตฌํ•˜๊ธฐ 5

1eehyunji 2023. 11. 4. 01:50

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)