Cod sursa(job #2052766)

Utilizator berindeiChesa Matei berindei Data 30 octombrie 2017 23:04:41
Problema Secventa 5 Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <bits/stdc++.h>
#define nmax (1<<20)+1
using namespace std;
ifstream in("secv5.in");
ofstream out("secv5.out");
pair <unsigned, int> v[nmax];
int v2[nmax];
int f[nmax];
bool  cmp(pair<unsigned,int> a, pair<unsigned,int> b){
    return a.first<b.first;
}
int main(){
    long long rez, n, l, u, i, nr, val, st, eldif;
    in >> n >> l >> u;
    for (i=1; i<=n; i++){
        in >> nr;
        v[i]={(unsigned)nr, (int)i};
    }
    sort (v+1, v+n+1, cmp);
    val=0;
    for (i=1; i<=n; i++){
        if (v[i].first!=v[i-1].first)
            val++;
        v2[v[i].second]=val;
    }
//    for (i=1; i<=n; i++)
//        cout << v2[i] <<' ';

    {//Lungime u
    eldif=0;
    i=1;
    while (eldif<u && i<=n){
        if (f[v2[i]]==0)
            eldif++;
        f[v2[i]]++;
        i++;
    }
    f[v2[--i]]--;
    eldif--;
    st=1;
    rez=i*(i-1)/2;
    for (; i<=n; i++){
        if (f[v2[i]]==0)
            eldif++;
        f[v2[i]]++;
        while (eldif>u){
            st--;
            do{
                st++;
                f[v2[st]]--;
            }while(f[v2[st]]!=0);
            st++;
            eldif--;
        }
        rez+=i-st+1;
    }
    }

    memset(f, 0, sizeof(f));

    {//Lungime l-1
    eldif=0;
    i=1;
    while (eldif<l-1 && i<=n){
        if (f[v2[i]]==0)
            eldif++;
        f[v2[i]]++;
        i++;
    }
    f[v2[--i]]--;
    eldif--;
    st=1;
    rez-=i*(i-1)/2;
    for (; i<=n; i++){
        if (f[v2[i]]==0)
            eldif++;
        f[v2[i]]++;
        while (eldif>l-1){
            st--;
            do{
                st++;
                f[v2[st]]--;
            }while(f[v2[st]]!=0);
            st++;
            eldif--;
        }
        rez-=i-st+1;
    }
    }
    assert(rez>=0);
    out << rez;
}