Cod sursa(job #1713158)

Utilizator silkMarin Dragos silk Data 4 iunie 2016 21:05:28
Problema Divk Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <cstdio>
#include <algorithm>
#define NMax 500005
using namespace std;

struct abc{
int rest;
int lg;
};
abc a[NMax];

long long sum[NMax];
long long v[NMax];
int x[NMax];

bool cmp( const abc A, const abc B )
{
    if( A.rest == B.rest )
    return A.lg < B.lg;

    return A.rest < B.rest;
}

int main(){
    freopen("divk.in","r",stdin);
    freopen("divk.out","w",stdout);

    int f,mid,st,dr,i,j,ii,A,B,n,k,t;
    long long ans=0;

    scanf("%d %d %d %d",&n,&k,&A,&B);

    for( i = 1; i <= n; ++i ) scanf("%lld",&v[i]);

    for( i = 1; i <= n; ++i )
    sum[i] = ( sum[i-1] + v[i] ) % k;

    for( i = 1; i <= n; ++i )
    {
        a[i].lg = i;
        a[i].rest = sum[i];
    }


    sort( a + 1, a + n + 1, cmp );

    for( i = 1; i < n; )
    {
        for( j = i + 1; j <= n && a[i].rest == a[j].rest ; ++j );

        if(j > i + 1)
        {
            for( t = 1, ii = i; ii < j; ++ii, ++t ) x[t] = a[ii].lg;

            for( ii = 1; ii < t; ++ii )
            {
                for( st = ii + 1, dr = t; st <= dr; )
                {
                    mid = ( st + dr) /2;
                    if( x[mid] - x[ii] < A ) st = mid + 1;
                    else if( x[mid] - x[ii] > B) dr = mid - 1;
                    else { f = mid; st = mid + 1; }
                }
            ans += f - ii;
            }
        }

        i = j;
    }

    printf("%lld\n",ans);



return 0;
}