Cod sursa(job #1149373)

Utilizator alex_bBinca Alexandra alex_b Data 21 martie 2014 19:00:28
Problema Divk Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <fstream>
using namespace std;
  
ifstream fin("divk.in");
ofstream fout("divk.out");

struct st{
	unsigned int start;
	unsigned int stop;
	vector<int> pos;
};
  
int main(int argc, char *argv[]) {
	int k, a, b, n, c = 0, ant = 0;
	fin >> n >> k >> a >> b;
	vector<st> mod(k, st());
	mod[0].pos.push_back(0);

	for (int i = 0; i < n; ++i) {
		int t;
		fin >> t;
		int m = (ant + t) % k;
		ant = m;
		
		st s = mod[m];
		
		if (s.pos.size() == 0) {
			s.pos.push_back(i + 1);
			s.start = 0;
			s.stop = 0;
			continue;
		}
		
		while (s.stop < s.pos.size()) {
			if (i - s.pos[s.stop] + 1 >= a) {
				++s.stop;
			} else {
				break;
			}
		}
		while (s.start < s.pos.size()) {
			if (i - s.pos[s.start] + 1 < b) {
				++s.start;
			} else {
				break;
			}
		}
		
		s.pos.push_back(i + 1);	
		c = c + s.stop - s.start + 1;
	}    
	  
	fout << c << endl;
	fout.close();
	return 0;
}