Cod sursa(job #2750406)

Utilizator NeacsuMihaiNeacsu Mihai NeacsuMihai Data 11 mai 2021 01:22:40
Problema Secventa 5 Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <iostream>
#include <fstream>
#include <cstring>

#define NMAX 1048576
#define MOD1 1000003
#define MOD2 1000021

using namespace std;

ifstream fin ("secv5.in");
ofstream fout ("secv5.out");

int N, L, U;
unsigned int v[NMAX + 1];
int f1[MOD1];
int f2[MOD2];

int secventeMaxim(int lg){

    if(lg == 0){
        return 0;
    }

    int raspuns = 0;
    int cnt = 0;

    int left = 1;
    for(int right = 1; right <= N; right++){
        unsigned int x = v[right];

        if(f1[x % MOD1] == 0 || f2[x % MOD2] == 0){
            cnt++;
        }

        f1[x % MOD1]++;
        f2[x % MOD2]++;

        while(cnt > lg){
            unsigned int y = v[left];

            f1[y % MOD1]--;
            f2[y % MOD2]--;

            if(f1[y % MOD1] == 0 || f2[y % MOD2] == 0){
                cnt--;
            }


            left++;
        }

        //cout << left << ' ' << right << "\ncnt = " << cnt << "\n";

        raspuns = raspuns + (right - left + 1); //in cate moduri pot sa mut left, iar right sa ramana fixat

        //cout << "\n";
    }

    return raspuns;
}

int main()
{
    fin >> N >> L >> U;

    for(int i = 1; i <= N; i++){
        fin >> v[i];
    }

    int mx = secventeMaxim(U);

    memset(f1, 0, sizeof(f1));
    memset(f2, 0, sizeof(f2));
    int mn = secventeMaxim(L - 1);

    fout << mx - mn;

    return 0;
}