17390번: 이건 꼭 풀어야 해!
[2, 5, 1, 2, 3]을 비내림차순으로 정렬하면 [1, 2, 2, 3, 5]이다.
www.acmicpc.net
문제
숭실골 높은 언덕 깊은 골짜기에 출제로 고통 받는 욱제가 살고 있다!
욱제는 또 출제를 해야 해서 단단히 화가 났다. 그래서 욱제는 길이 $N$짜리 수열 $A$를 만들고, $A$를 비내림차순으로 정렬해서 수열 $B$를 만들어 버렸다!! 여기서 $B$를 출력하기만 하면 문제가 너무 쉬우니까 하나만 더 하자. 아래와 같은 질문이 무려 $Q$개나 주어진다!! (ㅎㅎ;; ㅈㅅ.. ㅋㅋ!!)
- L R: $B_L +B_{L+1}+...+B_{R-1}+B_R$ 을 출력한다.

Figure 1. 모든 참가자가 문제를 풀 수 있을 것이라고 기대하는 욱제의 표정
욱제의 질문에 답하고 함께 엠티를 떠나자!!
입력
첫 번째 줄에 수열 A의 길이 N과 질문의 개수 Q가 공백으로 구분되어 주어진다. (1 ≤ $N$, $Q$ ≤ 300,000)
두 번째 줄에 N개의 정수 $A_1, A_2, ..., A_N$이 공백으로 구분되어 주어진다. $A_i$는 수열 A의 i 번째 수이다. (1 ≤ $A_i$ ≤ 1,000)
세 번째 줄부터 Q개의 줄에 걸쳐 욱제의 질문을 의미하는 두 수 $L$, $R$이 공백으로 구분되어 주어진다. (1 ≤ $L$ ≤ $R$ ≤ $N$)
주어지는 모든 입력은 자연수이다.
출력
$Q$개의 줄에 걸쳐, 질문의 답을 순서대로 각각 출력한다.
코드
import sys
input = sys.stdin.readline
n, q = map(int, input().split())
a = list(map(int, input().split()))
b = sorted(a) # 비내림차순 정렬
# 누적합
prefix_sum = [0]*(n+1)
for i in range(1, n+1):
prefix_sum[i] = prefix_sum[i-1]+b[i-1]
for _ in range(q):
l, r = map(int, input().split())
print(prefix_sum[r]-prefix_sum[l-1])
'문제풀이 > 누적합' 카테고리의 다른 글
[Python/파이썬] 백준 20159번 동작 그만. 밑장 빼기냐? (0) | 2024.01.10 |
---|---|
[Python/파이썬] 백준 19951번 태상이의 훈련소 생활 (1) | 2024.01.09 |
[Python/파이썬] 백준 21757번 나누기 (2) | 2023.11.26 |
[Python/파이썬] 백준 10713번 기차 여행 (1) | 2023.10.17 |
[Python/파이썬] 백준 13422번 도둑 (0) | 2023.09.02 |
17390번: 이건 꼭 풀어야 해!
[2, 5, 1, 2, 3]을 비내림차순으로 정렬하면 [1, 2, 2, 3, 5]이다.
www.acmicpc.net
문제
숭실골 높은 언덕 깊은 골짜기에 출제로 고통 받는 욱제가 살고 있다!
욱제는 또 출제를 해야 해서 단단히 화가 났다. 그래서 욱제는 길이 $N$짜리 수열 $A$를 만들고, $A$를 비내림차순으로 정렬해서 수열 $B$를 만들어 버렸다!! 여기서 $B$를 출력하기만 하면 문제가 너무 쉬우니까 하나만 더 하자. 아래와 같은 질문이 무려 $Q$개나 주어진다!! (ㅎㅎ;; ㅈㅅ.. ㅋㅋ!!)
- L R: $B_L +B_{L+1}+...+B_{R-1}+B_R$ 을 출력한다.

Figure 1. 모든 참가자가 문제를 풀 수 있을 것이라고 기대하는 욱제의 표정
욱제의 질문에 답하고 함께 엠티를 떠나자!!
입력
첫 번째 줄에 수열 A의 길이 N과 질문의 개수 Q가 공백으로 구분되어 주어진다. (1 ≤ $N$, $Q$ ≤ 300,000)
두 번째 줄에 N개의 정수 $A_1, A_2, ..., A_N$이 공백으로 구분되어 주어진다. $A_i$는 수열 A의 i 번째 수이다. (1 ≤ $A_i$ ≤ 1,000)
세 번째 줄부터 Q개의 줄에 걸쳐 욱제의 질문을 의미하는 두 수 $L$, $R$이 공백으로 구분되어 주어진다. (1 ≤ $L$ ≤ $R$ ≤ $N$)
주어지는 모든 입력은 자연수이다.
출력
$Q$개의 줄에 걸쳐, 질문의 답을 순서대로 각각 출력한다.
코드
import sys input = sys.stdin.readline n, q = map(int, input().split()) a = list(map(int, input().split())) b = sorted(a) # 비내림차순 정렬 # 누적합 prefix_sum = [0]*(n+1) for i in range(1, n+1): prefix_sum[i] = prefix_sum[i-1]+b[i-1] for _ in range(q): l, r = map(int, input().split()) print(prefix_sum[r]-prefix_sum[l-1])
'문제풀이 > 누적합' 카테고리의 다른 글
[Python/파이썬] 백준 20159번 동작 그만. 밑장 빼기냐? (0) | 2024.01.10 |
---|---|
[Python/파이썬] 백준 19951번 태상이의 훈련소 생활 (1) | 2024.01.09 |
[Python/파이썬] 백준 21757번 나누기 (2) | 2023.11.26 |
[Python/파이썬] 백준 10713번 기차 여행 (1) | 2023.10.17 |
[Python/파이썬] 백준 13422번 도둑 (0) | 2023.09.02 |