Cod sursa(job #454939)

Utilizator darrenRares Buhai darren Data 12 mai 2010 20:43:48
Problema Divk Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include<fstream>
#include<vector>
using namespace std;

void read();
void write();
void doit();

int a, b, n, k, s[500001];
long long tot;

vector<vector<int> > lst(100001);

int main()
{
	read();
	doit();
	write();
	return 0;
}

void read()
{
	ifstream fin("divk.in");
	fin >> n >> k >> a >> b;
	int aux;
	for (int i = 1; i <= n; ++i)
	{
		fin >> aux;
		s[i] = s[i - 1] + aux;
		lst[s[i] % k].push_back(i);
	}
	fin.close();
}

void write()
{
	ofstream fout("divk.out");
	fout << tot;
	fout.close();
}
void doit()
{
	int fir, pf, las;
	for (int i = 0; i < k; ++i)
	{
		for (int j = 0; j < lst[i].size(); ++j)
		{
			if (j == 0)
			{
				fir = lst[i][j];
				pf = 0;
				las = 0;
			}
			else
				if (lst[i][j] - fir <= b)
				{
					if ( lst[i][j] - fir >= a )
					{
						++tot;
						++las;
					}
				}
				else
				{
					while ( lst[i][j] - fir > b )
					{
						fir = lst[i][pf + 1];
						++pf;
					}
					tot += las;
					las = 0;
				}
		}
		tot += las;
	}
}