Submission #1369149

#TimeUsernameProblemLanguageResultExecution timeMemory
1369149horiaboeriuGondola (IOI14_gondola)C++20
100 / 100
39 ms5876 KiB
#include <bits/stdc++.h>
#include "gondola.h"
using namespace std;
const int MAXV = 250000;
const int MAXN = 100000;
const int MOD = 1e9 + 9;
map<int, int> fr;
struct nume {
    int valf, vali;
} v2[MAXN];
char cmp(nume a, nume b) {
    return a.valf < b.valf;
}
int valid(int n, int v[]) {
    int i, p, minr, j, rez;
    //trebuie sa nu apara duplicate, fac cu map ca o sa folosesc functia si pentru ultimele subtaskuri
    minr = n + 1;
    p = -1;
    rez = 1;
    for (i = 0; i < n; i++) {
        if (v[i] < minr) {
            minr = v[i];
            p = i;
        }
        if (fr.count(v[i]) > 0) {
            rez = 0;
        }
        fr[v[i]] = 1;
    }
    if (rez == 0) {//daca sunt duplicate
        return 0;
    }
    if (minr > n) {
        return 1;
    }
    //verific daca restul sunt pe pozitiile corecte
    for (i = 1; i < n; i++) {
        j = (p + i) % n;
        if (v[j] <= n && v[j] != minr + i) {
            rez = 0;
        }
    }
    return rez;
}

int replacement(int n, int v[], int rep[]) {
    //este corecta secventa
    //gasesc la fiecare valoare initiala cat trebuie sa devina
    int i, p, minr, j, x, nr;
    minr = n + 1;
    p = 0;
    for (i = 0; i < n; i++) {
        if (v[i] < minr) {
            minr = v[i];
            p = i;
        }
    }
    if (minr == n + 1) {
        minr = 1;//consider ca pe prima pozitie este 1
    }
    nr = 0;
    for (i = 0; i < n; i++) {
        j = (p + i) % n;
        if (v[j] > n) {
            v2[nr].valf = v[j];//valoarea finala
            v2[nr].vali = (minr + i - 1) % n + 1;//valoarea initiala
            nr++;
        }
    }
    sort(v2, v2 + nr, cmp);
    j = 0;
    x = n + 1;
    for (i = 0; i < nr; i++) {
        rep[j] = v2[i].vali;
        j++;
        for (; x < v2[i].valf; x++) {
            rep[j] = x;
            j++;
        }
        x = v2[i].valf + 1;
    }
    return j;
}

int expRapida(int a, int b) {
    int rez;
    rez = 1;
    while (b > 0) {
        if (b % 2 > 0) {
            rez = (long long)rez * a % MOD;
        }
        a = (long long)a * a % MOD;
        b /= 2;
    }
    return rez;
}
int countReplacement(int n, int v[]) {
    if (valid(n, v) == 0) {
        return 0;
    }
    //este corecta secventa
    int i, minr, j, nr, rez;
    minr = n + 1;
    for (i = 0; i < n; i++) {
        if (v[i] < minr) {
            minr = v[i];
        }
    }
    rez = 1;
    if (minr == n + 1) {
        rez = n;//daca toate sunt > n nu stiu cine trebuie sa ajunga la fiecare valoare deci pot fi in orice ordine
        //si in total sunt n posibilitati, adica depinde de cine este primul
    }
    nr = 0;
    for (j = 0; j < n; j++) {
        if (v[j] > n) {
            v2[nr].valf = v[j];//valoarea finala, doar asta conteaza
            nr++;
        }
    }
    sort(v2, v2 + nr, cmp);
    if (nr > 0) {
        rez = (long long)rez * expRapida(nr, v2[0].valf - n - 1) % MOD;
        for (i = 1; i < nr; i++) {
            rez = (long long)rez * expRapida(nr - i, v2[i].valf - v2[i - 1].valf - 1) % MOD;
        }
    }
    return rez;
}
#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...