만드는 중입니다

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

Egor의 문제

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

요약
정렬된 배열에서 i<j<p<q이고 a_i * a_q = a_j * a_p를 만족하는 인덱스 네 개를 찾거나, 없으면 NO를 출력합니다.
난이도

어려움10점 중 9점

유형
배열, 해시맵, 수학
정답자
아직 제출이 없습니다

문제

Egor는 훈련 캠프를 위해 어려운 문제를 하나 만들었다. 문제는 다음과 같다.

오름차순으로 정렬된 양의 정수 배열 aa가 nn개 주어진다. ai⋅aq=aj⋅apa_i \cdot a_q = a_j \cdot a_p를 만족하는 인덱스 4개 i<j<p<qi < j < p < q를 찾아라.

Egor는 이 문제의 채점 프로그램을 다음과 같이 작성했다.

bool getAnswer(InStream &stream, vector<long long> a) {
    string s = stream.readToken("NO|YES"); // PE if the string is not NO or YES
    if (s == "NO") return false;
    vector<int> b = stream.readInts(4, 1, (int)a.size()); // 4 indices between 1 and n
    int i = b[0] - 1, j = b[1] - 1, p = b[2] - 1, q = b[3] - 1;  // -1 to make 0-indexed
    stream.ensuref(i < j && j < p && p < q, "4 indices should be in increasing order");
    stream.ensuref(a[q] / a[p] == a[j] / a[i], "the products are not equal");
    return true;
}

곱셈은 long long 범위를 넘을 수 있으므로 Egor는 대신 나눗셈을 사용했다. 그런데 이제 Egor에게는 또 다른 문제가 생겼을지도 모른다.

입력

첫 번째 줄에 배열의 크기인 정수 nn (4≤n≤500 0004 \le n \le 500\,000)이 주어진다.

두 번째 줄에 배열 a1,a2,…,ana_1, a_2, \ldots, a_n (1≤a1<a2<…<an≤10181 \le a_1 < a_2 < \ldots < a_n \le 10^{18})이 주어진다.

출력

해가 존재하면 첫 번째 줄에 "YES"를, 존재하지 않으면 "NO"를 출력한다.

해가 존재하면 선택한 인덱스 i,j,p,qi, j, p, q를 이 순서대로 공백으로 구분해 출력한다. 해가 여러 개라면 그중 아무 것이나 출력해도 된다.

예제4

  1. 예제 1

    입력
    6
    2 6 11 21 47 120
    
    예상 출력
    YES
    1 3 4 6
    
  2. 예제 2

    입력
    5
    1 2 6 30 210
    
    예상 출력
    NO
    
  3. 예제 3

    입력
    4
    7 13 77 143
    
    예상 출력
    YES
    1 2 3 4
    
  4. 예제 4

    입력
    4
    10 29 31 100
    
    예상 출력
    NO