Cod sursa(job #1766388)

Utilizator Bodo171Bogdan Pop Bodo171 Data 27 septembrie 2016 21:45:32
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <iostream>
#include<fstream>
#include<vector>
using namespace std;
typedef unsigned int uint;
const uint mod=99017;
vector< pair<uint,int> > h[mod+5];
uint x,key;
int v[(1<<20)+5],n,p,u,i,i1,i2,j,neww,ap1[(1<<20)+5],ap2[(1<<20)+5],dist1,dist2;
long long tot;
bool moved;
void ins()
{
    key=x%mod;
    for(j=0;j<h[key].size();j++)
        if(h[key][j].first==x)
    {
        v[i]=h[key][j].second;
        return;
    }
    neww++;
    v[i]=neww;
    h[key].push_back(make_pair(x,neww));
}
int main()
{
    ifstream f("secv5.in");
    ofstream g("secv5.out");
    f>>n>>p>>u;
    for(i=1;i<=n;i++)
    {
        f>>x;
        ins();//facem hash pt a normaliza
        //in O(n)
    }
    i1=1;i2=1;
    /*aflam secventelecu cel mult u elemente distincte
    si scadem din ele pe cele cu cel mult p1elemente distincte*/
    for(i=1;i<=n;i++)
    {
        if(ap1[v[i]]==0)
            dist1++;
        if(ap2[v[i]]==0)
            dist2++;
        ap1[v[i]]++;
        ap2[v[i]]++;
        while(dist1>p-1)
         {
            if(ap1[v[i1]]==1) dist1--;
            ap1[v[i1]]--;
            i1++;//cel mult p-1
         }
         while(dist2>u)
        {
            if(ap2[v[i2]]==1) dist2--;
            ap2[v[i2]]--;
            i2++;//cel mult u
        }
        if(i1!=0)tot+=i1-i2;//adaugarea
    }
    g<<tot;
    return 0;
}