17128번: 소가 정보섬에 올라온 이유
첫째 줄에 소의 수를 나타내는 N과 욱제가 장난칠 횟수 Q가 주어진다. (4 ≤ N ≤ 200,000, 1 ≤ Q ≤ 200,000) 둘째 줄에 N마리 소들의 품질 점수 Ai가 순서대로 주어진다. (1 ≤ |Ai| ≤ 10) 셋째 줄에
www.acmicpc.net
문제
소 N마리가 정보섬에 올라왔다!
소들은 정보섬 1층 앞마당에서 A1, A2, A3, ..., AN, A1의 순서대로 동그랗게 앉아 쉬고 있다. 각 소들에게는 품질 점수 Ai가 적힌 스티커가 붙어 있다. 욱제는 소 떼 옆에서 효빈이가 계산해 둔 어떤 계산 식을 발견했는데, 그것은 아래와 같다.
풀어 쓰자면, 원형으로 둘러 앉은 소들에 대해서, 연속한 네 마리 소들의 품질 점수를 곱한 값을 모두 (정확히 한 번씩) 더한 것이다.
욱제는 효빈이가 학교를 떠나지 못하도록 심술부릴 작정이다. 욱제는 총 Q번에 걸쳐 어떤 i번째 소를 선택할 것이다. 그러고는 $A_i$가 적힌 스티커를 떼어내고, $A_i*(-1)$이 적힌 스티커를 붙일 작정이다. 그러면 효빈이는 Q번에 걸쳐서 S를 다시 계산해야 한다. 한 번 바꾼 스티커는 다음에 또 다시 바꾸지 않는 이상 계속 유지된다.
효빈이의 절친인 당신은 악동 욱제에게 괴롭힘 받는 효빈이를 도와 주기로 했다. 효빈이를 도와 S를 계산해 보자!
입력
첫째 줄에 소의 수를 나타내는 N과 욱제가 장난칠 횟수 Q가 주어진다. (4 ≤ N ≤ 200,000, 1 ≤ Q ≤ 200,000)
둘째 줄에 N마리 소들의 품질 점수 Ai가 순서대로 주어진다. (1 ≤ |$A_i$| ≤ 10)
셋째 줄에 욱제가 장난칠 Q개의 소의 번호가 순서대로 주어진다. (1 ≤ $Q_i$ ≤ N)
출력
Q개의 줄에 걸쳐 다시 계산된 S의 값을 출력한다.
코드
n, q = map(int, input().split())
cows = list(map(int, input().split()))
joke = list(map(int, input().split()))
arr = [1] * n
total = 0 # S
for i in range(n):
for j in range(4):
arr[i] *= cows[(i+j)%n]
total += arr[i]
for i in range(q):
for j in range(4):
arr[(joke[i]-1-j)%n] *= (-1)
total += arr[(joke[i]-1-j)%n] * 2
print(total)
'문제풀이 > 구현' 카테고리의 다른 글
[Python/파이썬] 백준 19236번 청소년 상어 (0) | 2023.09.12 |
---|---|
[Python/파이썬] 백준 1022번 소용돌이 예쁘게 출력하기 (0) | 2023.07.31 |
[Python/파이썬] 백준 2115번 갤러리 (0) | 2023.07.06 |
[Python/파이썬] 백준 17779번 게리맨더링 2 (0) | 2023.06.26 |
[Python/파이썬] 백준 17135번 캐슬 디펜스 (0) | 2023.06.25 |