Cod sursa(job #793385)

Utilizator vlad.doruIon Vlad-Doru vlad.doru Data 2 octombrie 2012 19:48:23
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <fstream>
#include <vector>

using namespace std;

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

const int HASH=666013;
const int N=1<<20;

vector< pair<int,int> > hash[HASH];

int n,mindif,maxdif,dif=0,result=0;
int v[N];

bool insert_hash(int x){
	int hash_code=x%HASH;
	for(int i=0;i<hash[hash_code].size();++i){
		if(hash[hash_code][i].first==x){
			hash[hash_code][i].second++;
			return true;
		}
	}
	dif++;
	hash[hash_code].push_back(make_pair(x,0));
	return true;
}

bool remove_hash(int x){
	int hash_code=x%HASH;
	vector<pair<int,int> >::iterator it;
	for(it=hash[hash_code].begin();it<hash[hash_code].end();++it){
		if((*it).first==x){
			if((*it).second==1){
				hash[hash_code].erase(it);
				dif--;
				return true;
			}
			(*it).second--;
			return true;
		}
	}
	return false;
}

bool find_hash(int x){
	int hash_code=x%HASH;
	for(int i=0;i<hash[hash_code].size();++i){
		if(hash[hash_code][i].first==x){
			return true;
		}
	}
	return false;
}

void solve(){
	int start=1,stop=1,beg,end;
	while(start<=n-mindif){
		if(dif<mindif){
			while(dif+find_hash(v[stop])<=mindif && stop<=n){
				insert_hash(v[stop]);
				stop++;
				if(dif==mindif){
					beg=stop-1;
					break;
				}
			}
		}
		if(stop==n && dif<mindif){
			return;
		}
		while(dif+find_hash(v[stop])<=maxdif && stop<=n){
			insert_hash(v[stop]);
			stop++;
		}
		end=stop-1;
		result+=(end-beg+1);
		remove_hash(v[start]);
		start++;
	}
}

int main(){
	in>>n>>mindif>>maxdif;
	for(int i=1;i<=n;++i){
		in>>v[i];
	}
	solve();
	out<<result;
	return 0;
}