Pagini recente » Cod sursa (job #818142) | Cod sursa (job #1371904) | Cod sursa (job #2075352) | Cod sursa (job #1813752) | Cod sursa (job #2729203)
#include <iostream>
#include <fstream>
#include <cstring>
#include <unordered_map>
#define uint unsigned int
using namespace std;
ifstream in("secv5.in");
ofstream out("secv5.out");
const uint N_MAX = (1ULL << 20);
int n, l, u, ans;
int lower[N_MAX + 10], upper[N_MAX + 10]; // sum[N_MAX + 10];
long long dp[N_MAX + 10];
uint v[N_MAX + 10];
unordered_map<uint, uint> fr;
void calculate(int bound, int arr[], bool smallGroup)
{
fr.clear();
int nrDif = 0, j = 0;
if(smallGroup)
bound--;
for(int i = 1; i <= n; i++)
{
if(fr[v[i]] == 0)
nrDif++;
fr[v[i]]++;
while(nrDif > bound)
{
fr[v[j]]--;
if(fr[v[j]] == 0U)
nrDif--;
j++;
}
if(!smallGroup && nrDif == bound && j == 0)
j = 1;
if(smallGroup && j > 0)
arr[i] = j - 1;
else
arr[i] = j;
}
}
int main()
{
in >> n >> l >> u;
for(int i = 1; i <= n; i++)
in >> v[i];
calculate(u, upper, 0);
calculate(l, lower, 1);
for(int i = 1; i <= n; i++)
{
//cout << i << ' ' << lower[i] << ' ' << upper[i] << '\n';
if(upper[i] == 0 && lower[i] == 0)
continue;
dp[i] = dp[i - 1] + (lower[i] - max(0, (upper[i] - 1)));
//cout << dp[i] << '\n';
//sum[i] = sum[i - 1] + dp[i];
}
out << dp[n] << '\n';
return 0;
}