아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

머리카락 자르기

시간 제한1초메모리 제한512 MB

요약
각 문턱값 j에 대해 j보다 큰 값을 모두 j로 낮춘 뒤 생기는 역전 수를 세어 0부터 N-1까지 출력한다.
난이도

어려움10점 중 8점

유형
정렬, 누적 합, 수학, 구현
정답자
아직 제출이 없습니다

문제

고집 센 삐침머리에 지친 Farmer John이 머리를 자르기로 했다. 그는 NN (1≤N≤1051\le N\le 10^5) 가닥의 머리카락을 일렬로 가지고 있고, ii번째 가닥의 처음 길이는 AiA_i 마이크로미터이다 (0≤Ai≤N0\le A_i\le N). 이상적으로는 머리카락 길이가 단조 증가하기를 바라므로, 그는 머리카락의 "나쁨"을 역전 수, 즉 i<ji < j이고 Ai>AjA_i > A_j인 쌍 (i,j)(i,j)의 개수로 정의한다.

각 j=0,1,…,N−1j=0,1,\ldots,N-1에 대해, FJ는 길이가 jj보다 큰 모든 가닥을 정확히 jj로 줄였을 때의 머리카락 나쁨을 알고 싶어 한다.

(재미있는 사실: 평균적인 사람의 머리에는 정말로 약 10510^5개의 머리카락이 있다!)

입력

첫째 줄에 NN이 주어진다.

둘째 줄에 A1,A2,…,ANA_1,A_2,\ldots,A_N이 주어진다.

출력

각 j=0,1,…,N−1j=0,1,\ldots,N-1에 대해 FJ의 머리카락 나쁨을 한 줄에 하나씩 출력한다.

이 문제에서 다루는 정수의 크기가 크므로 64비트 정수형(예: C/C++의 "long long")이 필요할 수 있다.

힌트

출력의 넷째 줄은 FJ의 머리카락을 길이 3으로 줄였을 때의 역전 수를 나타낸다. 이때 A=[3,2,3,3,0]A=[3,2,3,3,0]에는 다섯 개의 역전이 있다: A1>A2, A1>A5, A2>A5, A3>A5,A_1>A_2,\,A_1>A_5,\,A_2>A_5,\,A_3>A_5, 그리고 A4>A5A_4>A_5.

예제1

  1. 예제 1

    입력
    5
    5 2 3 3 0
    
    예상 출력
    0
    4
    4
    5
    7