Cod sursa(job #2658612)

Utilizator Fantastic_Mantudor voicu Fantastic_Man Data 14 octombrie 2020 15:58:50
Problema Secventa 5 Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <stdio.h>
#include <vector>
using namespace std;
const int NMAX = (1<<20);
const int MOD = 666013;
vector < pair < int, int > > h[MOD];
int v[NMAX];
int k=0;
void add_hash(int x) {
    unsigned int i=0,cod=x%MOD;
    while(i<h[cod].size() && h[cod][i].first!=x)
        i++;
    if(i==h[cod].size()) {
        h[cod].push_back({x,1});
        k++;
    } else
        h[cod][i].second++;
}
void del_hash(int x) {
    unsigned int i=0,cod=x%MOD;
    while(i<h[cod].size() && h[cod][i].first!=x)
        i++;
    if(i<h[cod].size()) {
        h[cod][i].second--;
        if(h[cod][i].second==0) {
            h[cod].erase(h[cod].begin()+i);
            k--;
        }
    }
}
long long solve(int n,int dist) {
    int st,dr;
    long long cate=0;
    for(st=0;st<MOD;st++)
        h[st].clear();
    k=0;
    st=dr=0;
    while(dr<n) {
        add_hash(v[dr++]);
        while(st<n && k>dist)
            del_hash(v[st++]);
        cate+=(long long)dr-st+1;
    }
    return cate;
}
int main() {
    FILE *fin,*fout;
    int n,l,r,i;
    fin=fopen("secv5.in","r");
    fscanf(fin,"%d%d%d",&n,&l,&r);
    for(i=0;i<n;i++)
        fscanf(fin,"%d",&v[i]);
    fclose(fin);
    fout=fopen("secv5.out","w");
    fprintf(fout,"%lld",solve(n,r)-solve(n,l-1));
    fclose(fout);
    return 0;
}