Cod sursa(job #2951738)

Utilizator TimiCodeazaTimotei Andrei TimiCodeaza Data 7 decembrie 2022 10:25:50
Problema Secventa 5 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <stdio.h>
#include <string.h>
#define NMAX (1 << 20) + 1
#define modulo 666013

FILE *f = fopen("secv5.in", "rt"), *g = fopen("secv5.out", "wt");

struct hash
{
    unsigned long int x, nr;
    hash *urm;
} *vf[modulo];

unsigned long int a[NMAX], n, i, j, k, v[NMAX], min1, max1;
unsigned long int L[NMAX];

void citire()
{
    unsigned long int nr = 1, x, ok, l;
    hash *p;
    fscanf(f, "%lu %lu %lu\n", &n, &min1, &max1);
    char s[102];
    for (i = 1; i <= n; i++)
    {
        fgets(s, 100, f);
        k = 0;
        for (j = 0; s[j] != ' ' && s[j] != '\n'; j++)
            k = k * 10 + (unsigned long int)s[j];
        x = k % modulo;
        ok = 0;
        p = vf[x];
        while (p)
        {
            if (p->x == k)
            {
                ok = p->nr;
                break;
            }
            p = p->urm;
        }
        if (ok)
            a[i] = ok;
        else
        {
            a[i] = nr++;

            p = new hash;
            p->nr = nr - 1;
            p->x = k;
            p->urm = vf[x];
            vf[x] = p;
        }
    }
}

long long calcul(unsigned long int x)
{
    unsigned long int start = 1, final = 0, nr = 0;
    for (i = 1; i <= n; i++)
    {
        v[i] = 0;
        L[i] = 0;
    }
    while (final <= n)
    {
        final++;
        v[a[final]]++;
        if (v[a[final]] == 1)
            nr++;
        while (nr > x)
        {
            start++;
            v[a[start - 1]]--;
            if (v[a[start - 1]] == 0)
                nr--;
        }
        L[final] = start;
    }
    long long sol = 0;
    for (i = 1; i <= n; i++)
        sol = sol + (long long)(i - L[i] + 1);
    return sol;
}

int main()
{
    citire();
    long long s1, s2;

    s1 = calcul(min1 - 1);
    s2 = calcul(max1);
    fprintf(g, "%lld\n", s2 - s1);
    fclose(f);
    fclose(g);
    return 0;
}