Submission #1363547

#TimeUsernameProblemLanguageResultExecution timeMemory
1363547toma_ariciuGondola (IOI14_gondola)C++20
75 / 100
10 ms2816 KiB
#include "gondola.h"

#include <bits/stdc++.h>

using namespace std;

const int maxN = 250005, mod = 1000000009;
int poz[maxN];

int lgput(int x, int p) {
    if (p == 0) {
        return 1;
    }
    int k = lgput(x, p/2);
    int ans = 1LL * k * k % mod;
    if (p % 2 == 1) {
        ans = 1LL * ans * x % mod;
    }
    return ans;
}

int valid(int n, int inputSeq[]) {
    for (int i = 1; i <= n; i++) {
        int x = inputSeq[i - 1];
        if (poz[x]) {
            return 0;
        }
        poz[x] = i;
    }

    int last = 1, pLast = poz[1];
    for (int i = 2; i <= n; i++) {
        if (poz[i] == 0) {
            continue;
        }
        if (pLast == 0) {
            last = i;
            pLast = poz[i];
            continue;
        }
        int diff = poz[i] - pLast;
        if (diff < 0) {
            diff += n;
        }
        if (diff != i - last) {
            // cout << last << ' ' << pLast << ' ' << i << ' ' << poz[i] << '\n';
            return 0;
        }
        last = i;
        pLast = poz[i];
    }

    return 1;
}


int replacement(int n, int gondolaSeq[], int replacementSeq[]) {
    vector <int> extras;
    int root = 1, pRoot = 1;
    for (int i = 1; i <= n; i++) {
        int x = gondolaSeq[i - 1];
        if (x > n) {
            extras.push_back(x);
        } else {
            root = x;
            pRoot = i;
        }
        poz[x] = i;

    }
    sort(extras.begin(), extras.end());
    int p = 0, last = n + 1;
    for (int i = 0; i < extras.size(); i++) {
        int x = extras[i];
        int trueNumber = (root + (poz[x] - pRoot + n) % n) % n;
        if (trueNumber == 0) {
            trueNumber += n;
        }
        replacementSeq[p++] = trueNumber;
        while (last < extras[i]) {
            replacementSeq[p++] = last;
            last++;
        }
        last++;
    }

    return p;
}

int countReplacement(int n, int inputSeq[])
{
    if (!valid(n, inputSeq)) {
        cout << "here?\n";
        return 0;
    }
    int total = 0;
    vector <int> extras;
    for (int i = 1; i <= n; i++) {
        int x = inputSeq[i - 1];
        if (x > n) {
            extras.push_back(x);
        }
        poz[x] = i;
        total = max(total, x);
    }
    total -= n;
    if (total == 0) {
        return 1;
    }
    sort(extras.begin(), extras.end());
    reverse(extras.begin(), extras.end());
    extras.push_back(n);
    int ans = 1;
    for (int i = 1; i < extras.size(); i++) {
        int diff = extras[i - 1] - extras[i] - 1;
        ans = 1LL * ans * lgput(i, diff) % mod;
    }
    return ans;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...