Cod sursa(job #1694511)

Utilizator sucureiSucureiRobert sucurei Data 25 aprilie 2016 15:51:02
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <cstdio>
#include <algorithm>
using namespace std;
unsigned int n,p,u,i,v[1050000],ap[1050000],x,stg,dr,nr,dst;
long long sol,sol1,sol2;
struct str
{
    unsigned int val, pos;
}in[1050000];
bool cmp(str a,str b)
{
    if(a.val<b.val) return 1;
    else
        if(a.val==b.val&&a.pos<b.pos) return 1;
    return 0;
}
int main()
{
    freopen("secv5.in","r",stdin);
    freopen("secv5.out","w",stdout);
    scanf("%u%u%u",&n,&p,&u);
    for(i=1;i<=n;i++)
    {
        scanf("%u",&in[i].val);
        in[i].pos=i;
    }
    x=0;
    sort(in+1,in+n+1,cmp);
    for(i=1;i<=n;i++)
        {
            if(in[i].val!=in[i-1].val)
                x++;
            v[in[i].pos]=x;
        }
    dr = 0;
    dst = 0 ;// nr de numere distincte
    x=u;
    for(i = 1; i <= n; i++)
    {
        while(dst <= x && dr < n)
        {
            if(ap[ v[dr + 1] ] == 0 && dst == x) break;
            dr++;
            ap[ v[dr] ]++;
            if(ap[ v[dr] ] == 1) dst++;
        }
            sol = sol + (dr - i + 1);

        ap[ v[i] ]--;
        if(ap[ v[i] ] == 0) dst--;
    }
    for(i=1;i<=1040000;i++) ap[i]=0;
       sol1=sol;
       dr = 0;
        dst = 0 ;
       x=p-1;
       sol=0;
       for(i = 1; i <= n; i++)
    {
        while(dst <= x && dr < n)
        {
            if(ap[ v[dr + 1] ] == 0 && dst == x) break;
            dr++;
            ap[ v[dr] ]++;
            if(ap[ v[dr] ] == 1) dst++;
        }
            sol = sol + (dr - i + 1);

        ap[ v[i] ]--;
        if(ap[ v[i] ] == 0) dst--;
    }
    sol2=sol;
    printf("%lld",sol1-sol2);
    return 0;
}