Cod sursa(job #2223003)

Utilizator Dobricean_IoanDobricean Ionut Dobricean_Ioan Data 18 iulie 2018 20:23:49
Problema Secventa 5 Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <deque>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>

using namespace std;



const int Dim = 120000;
int A[Dim],F[Dim],n,L,U,s = 0;
deque < int > D;
vector < pair < int , int > > P;
vector < int > b;


long long secv(int l);
void Get (int &x);

int main() {
	
	freopen("secv5.in","r",stdin);
	freopen("secv5.out","w",stdout);
	Get(n); Get(L); Get(U);
	for ( int i = 1; i <= n; ++i) {
		Get(A[i]);
		b.push_back(A[i]);
		}
	sort(b.begin(),b.end());
	b.erase(unique(b.begin(),b.end()),b.end());
	for ( int i = 1; i <= n; ++i)
		A[i] = lower_bound(b.begin(),b.end(),A[i]) - b.begin() + 1;
	printf("%d",secv(U) - secv(L-1));
	
}


long long secv(int l) {
	
	if ( l == 0)
		return 0;
	long long c = 0;
	memset(F,0,sizeof(F));
	D.clear();
	P.clear();
	D.push_front(1);
	F[A[1]] = 1;
	s = 1;
	for( int i = 2; i <= n; ++i) {
		if ( F[A[i]] == 0 and s + 1 <= l) {
			D.push_front(i);
			++F[A[i]];
			++s;
			continue;
		}
		if ( F[A[i]] > 0 and s <= l ) {
			D.push_front(i);
			++F[A[i]];
			continue;
		}
		P.push_back({D.back(),D.front()});
		while( s >= l and !D.empty()) {
			if ( F[A[D.back()]] == 1) {
				--s;
				--F[A[D.back()]];
				D.pop_back();
			}
			else {
				 --F[A[D.back()]];
				 D.pop_back();
				 }
		}
		D.push_front(i);
		if ( F[A[i]] == 0)
			++s;
		++F[A[i]];
			
	}
	P.push_back({D.back(),D.front()});
	for ( const auto & i : P) {
		c += (i.second - i.first + 1)*(i.second-i.first+2) / 2;
	}
	for ( int i = 1; i < P.size(); ++i)
		if ( P[i-1].second >= P[i].first)
			c -= (P[i-1].second - P[i].first+1) * (P[i-1].second - P[i].first + 2) / 2;
	return c;
}

const int Lim = 19000000;
int u =  Lim - 1;
char buf[Lim];
 
void Next () {
    if (++u == Lim)
        std::fread(buf, 1, Lim, stdin), u = 0;
}
 
void Get (int &x) {
	
    x = 0;
    for (; buf[u] < '0' || buf[u] > '9'; Next());
    for (x = 0; buf[u] >= '0' && buf[u] <= '9'; Next())
           x = x * 10 + buf[u] - '0';


}