Cod sursa(job #869123)

Utilizator vendettaSalajan Razvan vendetta Data 31 ianuarie 2013 22:55:22
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <set>
#include <queue>
#include <deque>

using namespace std;

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

#define nmax ((1<<20)+1)

#define ll long long

int n, L, U, viz[nmax], v[nmax];
pair<int,int> a[nmax];

void citeste(){
    f >> n >> L >> U;
    int x;
    for(int i=1; i<=n; ++i){
        f >> x; a[i] = make_pair(x, i);
    }
}

inline int afla(int X){
    int st = 1; int Distincte = 0; int Cnt = 0;
    for(int i=0; i<nmax; ++i) viz[i] = 0;

    for(int i=1; i<=n; ++i){
        if (viz[ v[i] ] == 0) ++Distincte;
        ++viz[ v[i] ];
        while( st <= i && Distincte > X ){
            --viz[ v[st] ];
            if (viz[ v[st] ] == 0 ) --Distincte;
            ++st;
        }
        Cnt += (i-st+1);
    }
    return Cnt;
}

void preprocesare(){
    sort(a+1, a+n+1);
    int poz = 1;
    v[ a[1].second ] = poz;
    for(int i=2; i<=n; ++i){
        if (a[i].first!= a[i-1].first){
            ++poz; v[ a[i].second ] = poz;
        }else v[ a[i].second ] = poz;
    }
    /*
    for(int i=1; i<=n; ++i) cout << v[i] << " ";
    cout << "\n";
    */
}

void rezolva(){
    // problema devine simpla daca fac urm observatie acele secvente cu numarul elem distincte intre L U sunt secventele cu nr distinte
    // cu cel mult U - secventele cu elm distincte cu cel mult L-1;
    preprocesare();
    cout << afla(U) - afla(L-1);
}

int main(){
    citeste();
    rezolva();

    f.close();
    g.close();

    return 0;
}