만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

Moloco의 Vitcoin 추첨 (어려움)

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

요약
각 티켓 i를 뽑으면 상금을 받고 확률 p_i로 계속, 1-p_i로 종료될 때, 기대 상금 합을 최대로 하는 순서를 구하고 동률이면 사전순으로 가장 앞선 순열을 출력한다.
난이도

보통10점 중 7점

유형
그리디, 정렬, 수학, 확률
정답자
아직 제출이 없습니다

문제

월말이 되면 Moloco 직원들은 사내 복지 혜택을 걸고 간단한 추첨을 한다.

당신은 Moloco의 소중한 직원이라 추첨권 nn장을 받았다. 추첨권 ii의 상금은 wi>0w_i > 0 Vitcoin이다.

추첨권 ii에는 동전이 하나씩 짝지어져 있다. 이 동전은 확률 pip_i로 앞면이 나오고 확률 1−pi1 - p_i로 뒷면이 나온다 (0<pi<10 < p_i < 1). 모든 동전 던지기는 서로 독립이다.

각 단계에서 아직 고르지 않은 추첨권을 하나 골라 상금을 즉시 받는다. 그다음 그 추첨권과 짝지어진 동전을 던진다. 앞면이 나오면 추첨이 이어져서 다음 추첨권을 고를 수 있고, 추첨권이 떨어질 때까지 이 과정을 반복한다. 뒷면이 나오면 추첨은 그 자리에서 끝나고, 그때까지 모은 Vitcoin을 모두 가진다.

모든 wiw_i와 pip_i를 알고 있다. 받는 Vitcoin의 기댓값을 최대로 만드는 추첨권 선택 순서를 구하라.

입력

첫째 줄에 정수 nn이 주어진다 (1≤n≤1 000 0001 \le n \le 1\,000\,000).

다음 nn개 줄에는 각각 두 정수 wiw_i와 qiq_i가 주어진다 (1≤wi≤10 0001 \le w_i \le 10\,000, 0<qi<10 0000 < q_i < 10\,000). 확률은 pi=qi/10000p_i = q_i / 10000이다.

출력

추첨권을 고르는 순서를 나타내는 길이 nn의 순열을 한 줄에 공백으로 구분해 출력한다. 순열의 원소는 11 이상 nn 이하의 정수다.

기댓값을 최대로 만드는 순열이 여러 개면 사전순으로 가장 앞서는 것을 출력한다.

힌트

순서 σ1,σ2,…,σn\sigma_1, \sigma_2, \dots, \sigma_n으로 고를 때 받는 Vitcoin의 기댓값은 ∑k=1nwσk∏j<kpσj\sum_{k=1}^{n} w_{\sigma_k} \prod_{j < k} p_{\sigma_j}이다.

첫 번째 예제에서 순서 (1,2,3)(1, 2, 3)의 기댓값은 4.554.55이고, 기댓값이 가장 큰 순서는 8.78.7을 주는 (2,3,1)(2, 3, 1)이다. 세 번째 예제에서는 순서 (2,3,1)(2, 3, 1)과 (3,2,1)(3, 2, 1)의 기댓값이 같지만 (2,3,1)(2, 3, 1)이 사전순으로 앞선다.

예제3

  1. 예제 1

    입력
    3
    2 3000
    5 5000
    7 2000
    
    예상 출력
    2 3 1
    
  2. 예제 2

    입력
    3
    3 5000
    5 1500
    7 2000
    
    예상 출력
    3 1 2
    
  3. 예제 3

    입력
    3
    1 4000
    1 5000
    1 5000
    
    예상 출력
    2 3 1