Pagini recente » Cod sursa (job #580847) | Cod sursa (job #3345939) | Cod sursa (job #3316263) | Diferente pentru problema/zigzag intre reviziile 1 si 16 | Cod sursa (job #3351328)
// aflam cate subsecvente contin maxim U elemente distincte (cntU) si din ele scadem numarul
// de subsecvente cu maxim L - 1 elemente distincte (cntL)
#include <iostream>
#include <vector>
#include <fstream>
#include <unordered_map>
#define int long long
using namespace std;
// numarul de subsecvente cu cel mult `upperBound` elemente distincte
int countSubseq(int upperBound, vector<int>& numbers) {
unordered_map<int, int> frq;
int ans = 0;
int left = 0;
// two pointers invariant: [left, right] always has <= U distinct elements
for (int right = 0; right < numbers.size(); right++) {
frq[numbers[right]]++;
while (frq.size() > upperBound and left < right) {
frq[numbers[left]]--;
if (frq[numbers[left]] == 0) frq.erase(numbers[left]);
left++;
}
ans += right - left + 1;
}
return ans;
}
int main() {
ifstream fin("secv5.in");
ofstream fout("secv5.out");
int N, L, U;
fin >> N >> L >> U;
vector<int> numbers(N);
for (int i = 0; i < N; i++)
fin >> numbers[i];
fout << countSubseq(U, numbers) - countSubseq(L - 1, numbers);
return 0;
}