Cod sursa(job #85689)

Utilizator andrei.12Andrei Parvu andrei.12 Data 22 septembrie 2007 12:48:33
Problema Divk Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include<stdio.h>
int n, k, a, b, i, p1, j, s1, s2, cit, v[100000], kk[500005], de[500005], r, w[100000], st;
long long s;
int gs(int b){
	int s1 = 0, i = 1;
	st = 1;
	p1 = 0;
	r = 0;
	while (i <= n){
		for (i=st; i<=v[r]; i++)
			if (de[i]-de[p1] > b){
				p1 ++;
				if (i-p1-1 > 0)
					s1 += i-p1-1;
				while (de[i]-de[p1] > b && p1+1 < i){
					p1 ++;
					s1 += i-1-p1;
				}
				if (de[i]-de[p1] <= b && p1 < i)
					s1 ++;
			}
			else
				s1 ++;
		for (j=p1+1; j<v[r]; j++)
			s1 += v[r]-j;
		p1 = v[r]+1;
		st = v[r]+2;
		r ++;
	}
	return s1;
}
int main()
{
	freopen("divk.in","r",stdin);
	freopen("divk.out","w",stdout);
	scanf("%d%d%d%d", &n, &k, &a, &b);
	for (i=1; i<=n; i++){
		scanf("%d", &kk[i]);
		s += kk[i];
		v[s % k] ++;
	}
	w[0] = 1;
	for (i=0; i<k; i++){
		v[i] += v[i-1];
		if (i > 0)
			w[i] = v[i-1]+1;
	}
	s = 0;
	for (i=1; i<=n; i++){
		s += kk[i];
		r = s % k;
		de[w[r]] = i;
		w[r] ++;
	}
	s1 = gs(b);
	s2 = gs(a-1);
	if (s1 - s2 < 0)
		s1 = s2;
	printf("%d\n", s1-s2);
	fclose(stdin);
	fclose(stdout);
	return 0;
}