Cod sursa(job #1838091)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 30 decembrie 2016 23:52:27
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <cstdio>
#include <unordered_map>
#define MAXN (1<<21)

using namespace std;

int n, L, U;
int a[MAXN];
long long sol;
unordered_map<int, int> mic, mare;

int adv(unordered_map<int, int> &m, int ind, int ok)
{
    for (int k = ind+1; k <= n; k++)
	{
		int val = m[a[k]];
		if (val == 0 && ok > 0) {
            if (ok == 2)
				m[a[k]]++;
            return k-1;
		}
        if (val == 0)
        	ok = 1;
		m[a[k]]++;
	}
	return n;
}

void solve()
{
    int indL = 0, indU = 0;
//    for (int i = 1; i <= n; i++)
//	{
//        if (dif <= L)
//		{
//			mic[a[i]]++;
//			mare[a[i]]++;
//            if (mic[a[i]] == 1)
//			{
//                dif++;
//
//                indL = indU = i;
//			}
//		}
//		else if (dif < U)
//		{
//			mare[a[i]]++;
//            if (mare[a[i]] == 1)
//			{
//                dif++;
//                indU = i;
//			}
//		}
//		else break;
//	}
	for (int i = 1; i <= L; i++)
		indL = adv(mic, indL, 2)+1;
	for (int i = 1; i <= U; i++)
		indU = adv(mare, indU, 0);
	sol = indU-indL+1;
    for (int i = 1; i <= n; i++)
	{
        mic[a[i]]--;
        mare[a[i]]--;
        if (mic[a[i]] == 0)
		{
            indL = adv(mic, indL, 2)+1;
		}
		if (mare[a[i]] == 0)
		{
            indU = adv(mare, indU, 0);
		}
		if (indL > n) break;
		sol += indU-indL+1;
	}
}

int main()
{
    freopen("secv5.in", "r", stdin);
    freopen("secv5.out", "w", stdout);

    scanf("%d %d %d", &n, &L, &U);
    for (int i = 1; i <= n; i++)
		scanf("%d ", &a[i]);
	solve();
	printf("%lld", sol);

    return 0;
}