Cod sursa(job #1641372)

Utilizator RG1999one shot RG1999 Data 8 martie 2016 22:42:08
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <cstdio>
#include <algorithm>
using namespace std;
int n,p,u,i,v[1050000],ap[1050000],x,stg,dr,nr,sol,sol1,sol2,dst;
struct str
{
    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("%d%d%d",&n,&p,&u);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&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;
       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("%d",sol2-sol1+1);
    return 0;
}