Pagini recente » Monitorul de evaluare | Cod sursa (job #772275) | Cod sursa (job #321954) | Cod sursa (job #2003316) | Cod sursa (job #2223006)
#include <deque>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
const int Dim = 1200000;
long long A[Dim],F[Dim],n,L,U,s = 0;
deque < int > D;
vector < pair < int , int > > P;
vector < long long > b;
long long secv(int l);
void Get (long long &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("%lld",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 (long long &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';
}