Submission #1229094

#TimeUsernameProblemLanguageResultExecution timeMemory
1229094AMel0nGondola (IOI14_gondola)C++20
100 / 100
30 ms5464 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"
const ll MOD = 1000000009ll;

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;
}

ll binExpo(ll a, ll b) {
    if (b == 0) return 1;
    if (b % 2) {
        ll temp = binExpo(a, (b-1)/2);
        return (((a * temp) % MOD) * temp) % MOD;
    }
    ll temp = binExpo(a, b/2);
    return (temp * temp) % MOD;
}

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 = (res * (binExpo(r, cur-pr)) % MOD) % MOD;
        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...