Cod sursa(job #1045407)

Utilizator ELHoriaHoria Cretescu ELHoria Data 1 decembrie 2013 15:40:11
Problema NextSeq Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <fstream>
#include <algorithm>

using namespace std;


ifstream cin("nextseq.in");
ofstream cout("nextseq.out");

const int nmax = int(1e4) + 2;
int N, M, P;
int a[nmax], b[nmax], x[nmax], pos[nmax];
int v[nmax];

void readData() {
    cin >> N >> M >> P;
    for (int i = 0;i < N;i++) {
        cin >> x[i];
    }

    sort (x,x + N);
    for (int i = 0;i < N;i++) {
        pos[x[i]] = i;
    }

    for (int i = 0;i < M;i++) {
        cin >> a[i];
    }

    for (int i = 0;i < P;i++) {
        cin >> b[i];
    }
}

int go1() {
    int ret = 1; 
    for (int i = 0;i < M;i++) {
        ret *= (pos[b[i]] - pos[a[i]] + 1);
    }
    return ret - 2;     
}

int go2() {
    int ret = 0;
    int nr = 1;
    for (int i = 1;i <= M;i++) {
        nr *= N;
    }

    for (int i = M + 1;i < P;i++) {
        nr *= N;
        ret += nr;
    }
    return ret;
}

int go3(int i,int s) {
    int ret = 0;
    if (s == 0) {
        if (i < M)
            for (int j = pos[a[i]];j < N;j++) {
               v[i] = x[j];
               ret += go3(i + 1,x[j] == a[i] ? 0 : 1);
            }
    } else {
        int nr = 1;
        for (int k = 0;k < M - i;k++) {
            nr *= N;
        }
        ret += nr;
    }   
    return ret;
}

int go4(int i,int s) {
    int ret = 0;
    
    if (s == 0) {
        if (i < P)
            for (int j = 0;j <= pos[b[i]];j++) {
                v[i] = x[j];
                ret += go4(i + 1,x[j] == b[i] ? 0 : 1);
            }
    } else {
        int nr = 1;
        for (int k = 0;k < P - i;k++) {
            nr *= N;
        }
        ret += nr;

    }
    return ret;
}

void solve() {
    if (M == P) {
        cout << go1() << "\n";
    } else {
        cout << go2() + go3(0,0) + go4(0,0) << "\n";
    }
}

int main()
{
    readData();
    solve();
    return 0;
}