Pagini recente » Cod sursa (job #2076998) | Cod sursa (job #1733235) | Cod sursa (job #1708306) | Cod sursa (job #1901436) | Cod sursa (job #2081284)
#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;
}