Cod sursa(job #1731186)

Utilizator Alexandru_Arama Alexandru Alexandru_ Data 18 iulie 2016 15:01:20
Problema Divk Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <iostream>
#include <fstream>

using namespace std;

long long n,k,a,b,s[500001],i,x,f[500001],f1[500001],ct,v[500001];

int caut (int i, int j, int x)
{
    if(i>j)
    {
        return i;
    }
    else
    {
        int m=(i+j)/2;
        if(v[m]-x<=b)caut(m+1,j,x);
        else caut(i,m-1,x);
    }
}
int caut1 (int i, int j, int x)
{
    if(i>j)
    {
        return i;
    }
    else
    {
        int m=(i+j)/2;
        if(v[m]-x<a)caut1(m+1,i,x);
        else caut1(i,m-1,x);
    }
}
int calcul (int k)
{
    int i;
    for(i=1;i<=k;i++)
    {
        int t=caut(i+1,k,v[i]);
        t-=(v[t]-v[i]>b || t>k);
        int t1=caut1(i+1,k,v[i]);
        t1+=(v[t1]-v[i]<a || t>k);
        if(t>0 && t1>0 && t<=k && t1<=k && v[t1]-v[i]>=a && v[t]-v[i]<=b)
        ct=ct+(t-t1+1);
    }
}
int sswap(int k)
{
    int i;
    for(i=1;i<=k/2;i++)
        swap(v[i],v[k-i+1]);
}
int main()
{
    ifstream fin ("divk.in");
    ofstream fout ("divk.out");
    fin>>n>>k>>a>>b;
    for(i=1;i<=n;i++)
    {
        fin>>x;
        s[i]=s[i-1]+x;
        s[i]%=k;
        if(!f[s[i]]){f1[i]=i,f[s[i]]=i;}
        else
        {
           f1[i]=f[s[i]];
           f[s[i]]=i;
        }if(!s[i] && i>=a && i<=b)ct++;
    }
    for(i=n;i>=1;i--)
        if(f1[i])
    {
        int j,k1=0;
    j=i;
    while(j!=f1[j])
    {
        v[++k1]=j;
        int t=j;
        j=f1[j];
        f1[t]=0;
      //  f1[t]=0;
    }
    v[++k1]=j;
    f1[j]=0;
    sswap(k1);
    calcul(k1);
    }
    fout<<ct;
    return 0;
}