Cod sursa(job #972578)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 12 iulie 2013 10:37:39
Problema Divk Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include<fstream>
#include<cstdlib>
#include<vector>
using namespace std;
int n,K,A,B,sum[500100],size[100100],ind[100100];
vector <int> poz[100100];
char *buffer;

inline void Citeste(int &x)
{
	while(*buffer<'0' || '9'<*buffer)
		buffer++;
	x=0;
	while('0'<=*buffer && *buffer<='9')
	{
		x=x*10+*buffer-'0';
		buffer++;
	}
}

inline long long Count(int L)
{
	int i,r;
	long long rez=0LL;
	poz[0].push_back(0);
	ind[0]=0;
	size[0]=1;
	for(i=1;i<=n;i++)
	{
		r=sum[i];
		while(ind[r]<size[r] && i-poz[r][ind[r]]>L)
			ind[r]++;
		rez+=1LL*(size[r]-ind[r]);
		poz[r].push_back(i);
		size[r]++;
	}
	for(i=0;i<K;i++)
	{
		poz[i].clear();
		size[i]=0;
		ind[i]=0;
	}
	return rez;
}

int main()
{
	int i,x;
	
	ifstream fin("divk.in");
	fin.seekg(0,ios::end);
	int fs=fin.tellg();
	fin.seekg(0,ios::beg);
	buffer=(char *)malloc(fs);
	fin.getline(buffer,fs,0);
	fin.close();
	
	Citeste(n); Citeste(K); Citeste(A); Citeste(B);
	for(i=1;i<=n;i++)
	{
		Citeste(x);
		x%=K;
		sum[i]=sum[i-1]+x;
		if(sum[i]>=K)
			sum[i]-=K;
	}
	
	ofstream fout("divk.out");
	fout<<(Count(B)-Count(A-1))<<"\n";
	fout.close();
	return 0;
}