【경쟁 프로 전형적인 90문】010의 해설(python)
개요
경쟁 프로 전형 90문 의 해설 기사입니다.
해설의 이미지를 봐도 모르는 (이해력이 부족한) 것이 많이 있었으므로, 나중에 다시 풀었을 때에 확인할 수 있도록 정리했습니다.
※순차적으로, 모든 문제의 해설 기사를 들어갈 예정입니다.
※★5이상의 문제는 난이도적으로 후회하고 있기 때문에, 투고 시기가 늦어질 가능성이 있습니다. (대신 정중하게 해설 해 주시는 분이라면 꼭 부탁드립니다)
이슈010-Score Sum Queries
문제 개요
N명의 학생이 2개의 쌍으로 나누어져 있을 때, 각 클래스의 학적 번호 L~R번의 합계점을 구한다.
이것을 Q개의 쿼리로 실시한다.
해결 방법
우선, 어리석게 Q개의 쿼리 1개 1개에 대해서, L~R번까지의 합계를 매번 구하는 방법이 생각됩니다만,
이 생각에서는, L~R번까지의 합계를 구하는 처리로, 최대 N회,
이것을 최대 Q회 실시하면 $O(QN)$ 가 되어, TLE가 되어 버립니다.
그래서 이번에는 누적 합을 사용합니다.
※누적합에 대해 알고 싶은 분은 여기 를 확인해 주십시오.
그러면
1. 각 세트의 누적 합 S를 구한다(N회)
2. Q개의 쿼리에 대해 $S[R]-S[L-1]$를 구한다. ($O(1)$를 Q회)
이것은 $O(N+Q)$의 계산량으로 충분히 고속으로 요구됩니다.
인용 소스 : 경쟁 프로 전형 90문 Github
구현
answer.py
N = int(input())
# 1組、2組で分けて得点を格納する
c1 = [0]*N
c2 = [0]*N
for i in range(N):
c, p = map(int, input().split())
if c == 1:
c1[i] = p
else:
c2[i] = p
# 各組で累積和 s1, s2を求める
s1 = [0]*(N+1)
s2 = [0]*(N+1)
for i in range(N):
s1[i+1] = s1[i] + c1[i]
s2[i+1] = s2[i] + c2[i]
# Q個のクエリに対し、L~R番までの合計を求める
# L番は和に含めるため、L-1番までの合計をマイナスする
Q = int(input())
for _ in range(Q):
l, r = map(int, input().split())
sum1 = s1[r] - s1[l-1]
sum2 = s2[r] - s2[l-1]
print(sum1, sum2)
마지막으로
문제의 해설을 읽어도 다른 사람의 코드를 봐도 확실히 모르는 분
힘에 조금이라도 될 수 있으면 다행입니다.
코드의 개선점이나 그 외, 의견등 있으면, 부담없이 코멘트해 주세요.
또, 이 기사를 읽고 이해할 수 있었던 분은 꼭 LGTM를 눌러 주실 수 있으면 기쁩니다.
(기사 투고의 모티베가 됩니다.)
여기까지 읽어 주셔서 감사합니다.
Reference
이 문제에 관하여(【경쟁 프로 전형적인 90문】010의 해설(python)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/wihan23/items/2b4402169469019be2e2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)