Cod sursa(job #3226320)

Utilizator stefan_dore_Stefan Dore stefan_dore_ Data 20 aprilie 2024 22:02:24
Problema Secventa 5 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.94 kb
/**
/// VARIANTA 1
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;

const int NMAX = (1 << 20) + 1;

struct Element {
    unsigned val;
    int poz;
};

Element v[NMAX];
int w[NMAX], F[NMAX];
int N;

ifstream f ("secv5.in");
ofstream g ("secv5.out");

bool comp (const Element &a, const Element &b) {
    return a.val < b.val;
}

void normalizare() {
    sort (v+1, v+N+1, comp);
    int x = 1;
    w[v[1].poz] = 1;
    for (int i=2; i<=N; i++) {
        if (v[i].val != v[i-1].val)
            x++;
        w[v[i].poz] = x;
    }
}

long long calcul(int dif) {
    long long nrSec = 0;
    int nrDif = 0, p =1;
    for (int i=1; i<=N; i++)
        F[i] = 0;
    for (int i=1; i<=N; i++) {
        if (++F[w[i]] == 1)
            ++nrDif;
        while (nrDif > dif && p<=i) {
            if (--F[w[p]] == 0)
                --nrDif;
                ++p;
        }
        nrSec += i-p+1;
    }
    return nrSec;
}

int main()
{
    int L, U;
    f >> N >> L >> U;
    for (int i=1;i<=N; i++) {
        f >> v[i].val;
        v[i].poz = i;
    }
    normalizare();
    g << calcul(U) - calcul(L-1);
    return 0;
}
*/

/// VARIANAT 2
#include <iostream>
#include <fstream>
#include <unordered_map>
using namespace std;

const int NMAX = (1 << 20) + 1;

int N;
unsigned v[NMAX+1];

ifstream f ("secv5.in");
ofstream g ("secv5.out");

long long calcul(int dif) {
    unordered_map<unsigned, int> M;
    long long nrSec = 0;
    int p = 1, nrDif = 0;
    for (int i=1; i<=N; i++) {
        if (++M[v[i]] == 1)
            nrDif++;
        while(nrDif > dif && p<=i) {
            if (--M[v[p]]==0)
                nrDif--;
            p++;
        }
        nrSec += i-p+1;
    }
    return nrSec;
}

int main()
{
    int L, U;
    f >> N >> L >> U;
    for (int i=1;i<=N; i++)
        f >> v[i];
    g << calcul(U) - calcul(L-1);
    return 0;
}