Algorithm/๋ฐฑ์ค€

๋ฐฑ์ค€ 11660๋ฒˆ : ๊ตฌ๊ฐ„ ํ•ฉ ๊ตฌํ•˜๊ธฐ5

giraffe_ 2024. 1. 12. 15:48

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)๊นŒ์ง€ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ ์ž‘์„ฑ
  • ์ฒซ์งธ ์ค„์— ํ‘œ์˜ ํฌ๊ธฐ 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)

 

 

 

 

 

ํ’€์ด

 ํ‘œ์˜ ํฌ๊ธฐ์ธ N์˜ ํฌ๊ธฐ๊ฐ€ ์ตœ๋Œ€ 1024, ์ฟผ๋ฆฌ์˜ ๊ฐœ์ˆ˜์ธ M์ด ์ตœ๋Œ€ 100,000์œผ๋กœ, ํ•ฉ์„ ๊ตฌํ•˜๋Š” ๋ฐ, ์ตœ์•…์˜ ๊ฒฝ์šฐ์—๋Š” N *N * M = 1024 * 1024 * 100,000 (์•ฝ 10,000,000,000 = 100์–ต)์ด ๊ฑธ๋ฆฐ๋‹ค!

 

 ๋งค๋ฒˆ ํ•ฉ์„ ๋ˆ„์ ํ•ด์„œ ๊ณ„์† ๋”ํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค๋Š”, ์ด์ „์˜ ํ•ฉ์˜ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅ ํ›„ ์ด์šฉํ•˜๋ฉด ํšจ์œจ์ ์œผ๋กœ ํ•ฉ์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. DP๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

 

 

[๋ฐฉ๋ฒ•1] ํ–‰ ๋ณ„๋กœ ๋ˆ„์  ํ•ฉ ์ €์žฅํ•˜๊ธฐ (1500ms ๋Œ€)

 

 1๋…„ ์ „์— ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ์ด ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋‹ค. ํ–‰ ๋ณ„๋กœ ๋ˆ„์ ํ•ฉ์„ ์ €์žฅํ•˜๋Š” DP๋ฅผ ํ™œ์šฉํ•˜์—ฌ 1500ms ๋Œ€์˜ ์‹œ๊ฐ„์œผ๋กœ ์„ฑ๊ณต์„ ํ•˜๊ธด ํ–ˆ์ง€๋งŒ, 800ms ๋Œ€๊ฐ€ ๋‚˜์˜ค๋Š” ๋‹ค๋ฅธ ํ’€์ด๋ณด๋‹ค๋Š” ๋น„ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์ด๋‹ค.

 

 

1. dp[i][j]๋กœ ํ–‰ ๋ณ„ ๋ˆ„์ ํ•ฉ ๊ตฌํ•˜๊ธฐ

 

ํ–‰ ๋ณ„๋กœ dp[i][0]~ dp[i][M] ๊นŒ์ง€์˜ ๋ˆ„์ ํ•ฉ์„ ๊ตฌํ•ด๋‚˜๊ฐ„๋‹ค. 

 

 

 

2. (x1, y1)๋ถ€ํ„ฐ (x2, y2)์˜ ํ•ฉ ๊ตฌํ•˜๊ธฐ

 

 

x1๋ถ€ํ„ฐ x2๊นŒ์ง€ dp[i][y2] - dp[i][y1] ์˜ ๊ฐ’์„ ๋”ํ•ด๋‚˜๊ฐ€๋ฉด ๋œ๋‹ค.

 

 

 

 

 

DP๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ–‰ ๋ณ„ ๋ˆ„์ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ๊ฒƒ์€ ์ตœ์ ํ™”๊ฐ€ ๋˜์—ˆ์ง€๋งŒ, ๋งค๋ฒˆ x1๋ถ€ํ„ฐ x2๊นŒ์ง€ ํ•ฉ์„ ๊ณ„์‚ฐํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค..

 

 

 

 

 

์ฝ”๋“œ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		StringTokenizer st = new StringTokenizer(br.readLine());
		int N = Integer.parseInt(st.nextToken());
		int M = Integer.parseInt(st.nextToken());
		
		int[][] dp = new int[N + 1][N + 1];
		
		for(int i = 1; i < N + 1; i++) { //ํ–‰๋ณ„ ๋ˆ„์  ํ•ฉ ์ €์žฅ
			st = new StringTokenizer(br.readLine());
			
			dp[i][1] = Integer.parseInt(st.nextToken());
			
			for(int j = 2; j < N + 1; j++) {
				dp[i][j] = dp[i][j - 1] + Integer.parseInt(st.nextToken());
			}
		}
		
		StringBuilder sb = new StringBuilder();
		for(int i = 0; i < M; i++) {
			st = new StringTokenizer(br.readLine());
		
			int x1 = Integer.parseInt(st.nextToken());
			int y1 = Integer.parseInt(st.nextToken());
			int x2 = Integer.parseInt(st.nextToken());
			int y2 = Integer.parseInt(st.nextToken());
		
			int sum = 0;
			for(int j = x1; j <= x2; j++) {
				sum += dp[j][y2] - dp[j][y1 - 1];
			}
			
			sb.append(sum + "\n");
		}
		
		System.out.println(sb);
	}

}

 

 

 

 

 

 

 

[๋ฐฉ๋ฒ•2] ํ–‰๋ ฌ ์ „์ฒด์˜ ๋ˆ„์  ํ•ฉ ์ €์žฅํ•˜๊ธฐ (800ms ๋Œ€)

 

๋งค๋ฒˆ ํ–‰ ๋ณ„๋กœ ๊ฐ’์„ ๋”ํ•˜๋Š” ์‹œ๊ฐ„์„ ์ค„์ด๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ–‰ ๋ณ„์ด ์•„๋‹ˆ๋ผ ํ–‰๋ ฌ ์ „์ฒด์˜ ๋ˆ„์ ํ•ฉ์„ ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค.

 

 

 

1. dp[i][j]๋กœ (1, 1)~(i, j)์˜ ๋ˆ„์ ํ•ฉ ๊ตฌํ•˜๊ธฐ

 

dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] + arr[i][j]

 

 

๋นจ๊ฐ„์ƒ‰ ๋ถ€๋ถ„์ธ dp[i - 1][j]์™€ ํŒŒ๋ž€์ƒ‰ ๋ถ€๋ถ„์ธ dp[i][j - 1]๋ฅผ ๋”ํ•˜๊ณ , ์ค‘๋ณตํ•ด์„œ ๋”ํ•œ ๋…ธ๋ž€์ƒ‰ ๋ถ€๋ถ„์ธ dp[i - 1][j - 1]์„ ๋นผ์ฃผ๊ณ , ์ž์‹ ์ธ arr[i][j]์„ ๋”ํ•ด์ค€๋‹ค.

 

 

 

2. (x1, y1)๋ถ€ํ„ฐ (x2, y2)์˜ ํ•ฉ ๊ตฌํ•˜๊ธฐ

 

(x1, y1)๋ถ€ํ„ฐ (x2, y2)๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐ๋Š” (1, 1)~(i, j)๊นŒ์ง€์˜ ๋ˆ„์ ํ•ฉ์ธ dp[i][j]๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ ์ ˆํžˆ ์—ฐ์‚ฐ์„ ํ•˜๋ฉด ๋œ๋‹ค.

 

 

๋…ธ๋ž€์ƒ‰ ๋ถ€๋ถ„์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ดˆ๋ก์ƒ‰ ๋ถ€๋ถ„์ธ dp[x1 - 1][y2]๋ฅผ ๋นผ๊ณ , ํŒŒ๋ž€์ƒ‰ ๋ถ€๋ถ„์ธ dp[x2][y1 - 1]์„ ๋นผ์ฃผ๊ณ , ์ค‘๋ณตํ•ด์„œ ๋บ€ ๋ถ€๋ถ„์ธ ํšŒ์ƒ‰ ๋ถ€๋ถ„์ธ dp[x1 - 1][y1 - 1] ์„ ๋”ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

 

 

 

 

์ฝ”๋“œ

import java.io.*;
import java.util.*;

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		
		int N = Integer.parseInt(st.nextToken());
		int M = Integer.parseInt(st.nextToken());
		
		int[][] arr = new int[N + 1][N + 1];
		
		for(int i = 1; i <= N; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			for(int j = 1; j <= N; j++) {
				arr[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		
		int[][] dp = new int[N + 1][N + 1]; //ํ–‰๋ ฌ (i, j)๊นŒ์ง€์˜ ํ•ฉ
		
		//ํ–‰๋ ฌ (i, j)๊นŒ์ง€์˜ ํ•ฉ ๊ตฌํ•˜๊ธฐ
		for(int i = 1; i <= N; i++) {
			for(int j = 1; j <= N; j++) {
				dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] + arr[i][j];
			}
		}
		
		StringBuilder sb = new StringBuilder();
		
		for(int i = 0; i < M; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			int x1 = Integer.parseInt(st.nextToken());
			int y1 = Integer.parseInt(st.nextToken());
			int x2 = Integer.parseInt(st.nextToken());
			int y2 = Integer.parseInt(st.nextToken());
			
			int answer = dp[x2][y2] - dp[x1 - 1][y2] - dp[x2][y1 - 1] + dp[x1 - 1][y1 - 1];
			sb.append(answer).append("\n");
		}
		
		System.out.println(sb);
	}

}

 

 

 

 

 

๊ฒฐ๊ณผ

 

800ms๋Œ€ : ๋ฐฉ๋ฒ•2

1500ms๋Œ€ : ๋ฐฉ๋ฒ•1

 

 

 

 

 

๋ฐฐ์šด์ 