Cod sursa(job #2263004)

Utilizator pasoi_stefanPasoi Stefan pasoi_stefan Data 17 octombrie 2018 23:27:03
Problema Secventa 5 Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
FILE *in=fopen("secv5.in","r");
FILE *out=fopen("secv5.out","w");
unsigned n,s,d,a[2000005],val[2000005],nr,x,L,secs,secd;
vector<pair<unsigned,unsigned> > Hash[100235];
int main(){
    fscanf(in,"%d%d%d",&n,&s,&d);
    for(unsigned i=1;i<=n;i++){
        fscanf(in,"%d",&x);
        unsigned key=x%100231;
        for(vector<pair<unsigned,unsigned> >::iterator it=Hash[key].begin();it!=Hash[key].end();++it)
            if((*it).first==x){
                a[i]=(*it).second;
                break;
            }
        if(!a[i]){
            ++nr;
            Hash[key].push_back(make_pair(x,nr));
            a[i]=nr;
        }
    }
    memset(val,0,sizeof(unsigned)*n);
    L=1; nr=0;
    for(unsigned i=1;i<=n;i++){
        if(val[a[i]]==0)
            ++nr;
        ++val[a[i]];
        while(nr>s-1){
            if(val[a[L]]==1)
                --nr;
            --val[a[L]];
            ++L;
        }
        secs+=i-L+1;
    }
    memset(val,0,sizeof(unsigned)*n);
    L=1; nr=0;
    for(unsigned i=1;i<=n;i++){
        if(val[a[i]]==0)
            ++nr;
        ++val[a[i]];
        while(nr>d){
            if(val[a[L]]==1)
                --nr;
            --val[a[L]];
            ++L;
        }
        secd+=i-L+1;
    }
    fprintf(out,"%d",secd-secs);
}