Cod sursa(job #1073552)

Utilizator vladm97Matei Vlad vladm97 Data 6 ianuarie 2014 15:26:30
Problema Divk Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <iostream>
#include <fstream>
#include <vector>
#define maxLength 500010

using namespace std;

int n,k,a,b;
long long output;
int input[maxLength];
int sumK[maxLength];

bool discount[maxLength];
vector< int > subset[maxLength];

ifstream in("divk.in");
ofstream out("divk.out");

void read()
{
	in >> n >> k >> a >> b;

	subset[0].push_back(0);

	for(int i=1; i<=n; i++)
	{
		in>>input[i];
		sumK[i] = (sumK[i-1] + input[i]) % k;
		subset[sumK[i]].push_back(i);
	}
}

long long divK(int l)
{
	int li,ls;
	long long count = 0;

	for(int i = 0; i < n; i++)
	{
		li = 0;

		for(ls = 0; ls < subset[i].size(); ls++)
		{
			if(ls < subset[i].size() - 1 )
			{
				if(subset[i][ls + 1] - subset[i][ls] == 1)
				{
					discount[ subset[i][ls] ] = true;
				}
			}

			while(subset[i][ls] - subset[i][li] > l)
			{
				count = (long long) count + (ls - li - 1 - discount[subset[i][li]]);
				li++;
			}
		}

        ls --;

		if(ls - li > 0)
		{
			while(li < ls)
			{
				count = (long long) count + (ls - li - discount[subset[i][li]]);
				li ++;
			}
		}
	}

	return count;
}

void solve()
{
	output = (long long) divK(b) - divK(a-1);
}

void write()
{
	out << output;
}

int main()
{
	read();
	solve();
	write();
}