Cod sursa(job #2081284)

Utilizator MarinPeptenaruMarin Vasile Peptenaru MarinPeptenaru Data 4 decembrie 2017 16:02:29
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("secv5.in");
ofstream out("secv5.out");
long long n,a,b;
unsigned v[1024*1024+20];
long long secventa (unsigned  x) /// nr de secvente care au cel mult x elemente
{
    unordered_map < unsigned , int > m; /// un map pe care il folosesc sa aflu cate elem distincte am
    long long nr=0,i=1,j=1;/// i este ultimul element din secventa, j este primul
    for(i=1; i<=n; i++)
    {
        m[v[i]]++;/// cresc nr de aparitii al lui a[i];
        while(m.size()>x)/// cat timp in map am mai prea multe valori;
        {
            m[v[j]]--;/// scad numarul de aparitii al primului element
            if(m[v[j]]==0) m.erase(v[j]);///  daca numarul de aparitii devine 0 il elimin din map
            j++;/// elimin primul element din secventa ( ca la o coada statica implementata cu un vector normal )
        }
        nr+=(i-j+1);
    }
    return nr;
}
int main()
{
    in>>n>>a>>b;/// cel putin a element si cel mult b
    for(int i=1; i<=n; i++)
        in>>v[i];
    out<<secventa(b)-secventa(a-1); /// solutia este numarul de secventa care contin cel mult b elemente din care scadem numarul de secvente cu cel mult a elemente
    return 0;
}