제출 #1229085

#제출 시각아이디문제언어결과실행 시간메모리
1229085AMel0n곤돌라 (IOI14_gondola)C++20
60 / 100
12 ms3928 KiB
#include <bits/stdc++.h>
using namespace std;
 
typedef long long ll;
#define FOR(i,N) for(ll i = 0; i < N; i++)
#define all(x) (x).begin(), (x).end()
#define F first
#define S second

#include "gondola.h"

int valid(int n, int seq[]) {
    unordered_set<int> seen;
    pair<int,int> pr = {-1,-1};
    FOR(i, n) {
        if (seen.find(seq[i]) != seen.end()) return 0;
        seen.insert(seq[i]);
        if (seq[i] <= n) {
            if (pr.F != -1) {
                if (pr.F <= seq[i]) {
                    if (seq[i]-pr.F != i-pr.S) return 0;
                } else {
                    if (pr.F-seq[i] != n-(i-pr.S)) return 0;
                }
            }
            pr = {seq[i], i};
        }
    }
    return 1;
}

int replacement(int n, int gSeq[], int replacementSeq[]) {
    int mi = min_element(gSeq, gSeq+n) - gSeq; 
    int mn = *min_element(gSeq, gSeq+n);
    if (mn > n) {mn = 1; mi = 0;}
    mi = (mi + n-mn+1) % n; // gondola 1 idx

    priority_queue<pair<ll,ll>> pq;
    FOR(i, n) if (gSeq[i] > n) pq.push({-gSeq[i], (i >= mi ? i-mi+1 : n-(mi-i)+1)});
    int repi = 0; 
    int pr = n; 
    while(pq.size()) {
        auto [cur, og] = pq.top(); 
        cur = -cur;
        pq.pop();
        replacementSeq[repi++] = og;
        for(int rep = pr+1; rep < cur; rep++) replacementSeq[repi++] = rep;
        pr = cur;
    }
    return repi;
}

int countReplacement(int n, int seq[]) {
    if (!valid(n, seq)) return 0;
    ll r = 0, res = 1, pr = n+1;
    priority_queue<ll> pq;
    FOR(i, n) if (seq[i] > n) {pq.push(-seq[i]);  r++;}
    if (r == n) res = n;
    while (pq.size()){
        ll cur = -pq.top();
        pq.pop();
        res = ll(res * (ll (pow(r, cur-pr)) % 1000000009)) % 1000000009;
        pr = cur+1;
        r--;
    }
    return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...