Cod sursa(job #970711)

Utilizator alex_HarryBabalau Alexandru alex_Harry Data 7 iulie 2013 16:49:59
Problema Divk Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <fstream>
#include <string.h>
using namespace std;
ifstream f("divk.in");
ofstream g("divk.out");
struct Element{
int value;
int pozition;
};
int N,K,A,B,Arr[500002],Rest[500002],Place[100002],Last_elem[100002];
Element Partial[500002],Partial2[500002];
long long add;
void Read()
{
    int i;
    f>>N>>K>>A>>B;
    for(i=1;i<=N;i++)
    {
        f>>Arr[i];
        Partial[i].value=(Partial[i-1].value+Arr[i])%K;
        Partial[i].value%=K;
        Partial[i].pozition=i;
        Rest[Partial[i].value]++;
        if(i>=A && i<=B && Partial[i].value==0)
            add++;
    }
    Place[0]=1;
    for(i=1;i<K;i++)
        Place[i]=Place[i-1]+Rest[i-1];
    for(i=1;i<=N;i++)
    {
        Partial2[Place[Partial[i].value]].value=Partial[i].value;
        Partial2[Place[Partial[i].value]++].pozition=Partial[i].pozition;
    }
}
long long Solve_for_1_L(int L)
{
    int i;
    long long counter=0;
    for(i=1;i<=N;i++)
    {
        if(Last_elem[Partial2[i].value]==0)
        {
            Last_elem[Partial2[i].value]=i;
            continue;
        }
        else
            for(int j=Last_elem[Partial2[i].value];j<i;j++)
                if(Partial2[i].pozition-Partial2[j].pozition<=L)
                {
                    counter+=(long long)i-j;
                    Last_elem[Partial2[i].value]=j;
                    break;
                }
    }
    return counter;
}
void Browse()
{
    long long X,Y;
    X=Solve_for_1_L(A-1);
    memset(Last_elem,0,sizeof(Last_elem));
    Y=Solve_for_1_L(B);
    g<<Y-X+add<<"\n";
}
int main()
{
    Read();
    Browse();
    return 0;
}