Pagini recente » Cod sursa (job #508914) | Cod sursa (job #2553583) | Cod sursa (job #283664) | Cod sursa (job #1180969) | Cod sursa (job #13019)
Cod sursa(job #13019)
#include <stdio.h>
#include <fstream>
#include <vector>
#include <iterator>
#include <map>
using namespace std;
#define in "secv5.in"
#define out "secv5.out"
vector<unsigned long> v;
vector<unsigned long> ok;
vector<unsigned long> L;
unsigned long n;
unsigned long l,u;
vector<unsigned long> sel;
void ReadData();
int main()
{
ReadData();
return 0;
}
void ReadData()
{
map<unsigned long,int> s;
unsigned long i, j;
freopen(in,"r",stdin);
freopen(out,"w",stdout);
scanf("%lu%lu%lu", &n,&l,&u);
v.resize(n+1);
ok.resize(n+1);
L.resize(n+1);
for ( i = 1; i <= n; i++ )
{
scanf("%lu", &v[i]);
ok[i] = v[i];
}
sort( ok.begin(), ok.end() );
int k = 0;
for ( i = 1; i <= n; i++ )
{
if ( ok[i] == ok[i+1] && i < n ) k++;
s[ok[i]] = i-k;
}
sel.resize(n-k);
for ( i = 1; i <= n; i++ )
{
v[i] = s[v[i]];
ok[i] = 0;
}
// pt l-1
unsigned long nr=1, total=1;
L[1] = 1;
ok[v[1]] = 1;
for ( i = 2; i <= n; i++ )
{
ok[v[i]] += 1;
if ( ok[v[i]] == 1 ) nr++;
if ( nr > l-1 )
{
for ( j = L[i-1]; j <= i; j++ )
{
ok[v[j]] -= 1;
if ( ok[v[j]] == 0 ) nr--;
// printf("%d %d %d %d \n", ok[v[j]], v[j], i, j);
if ( nr == l-1 )
{
L[i] = j+1;
break;
}
}
}
else L[i] = L[i-1];
total += (i-L[i]+1);
}
/* printf("\n");
for ( i = 1; i <= n; i++ )
{
printf("%d ", L[i]);
}*/
for ( i = 1; i <= n; i++ )
{
// printf("%d ", ok[i]);
ok[i] = 0;
}
// pt u
nr=1;
int total2=1;
L[1] = 1;
ok[v[1]] = 1;
for ( i = 2; i <= n; i++ )
{
ok[v[i]] += 1;
if ( ok[v[i]] == 1 ) nr++;
if ( nr > u )
{
for ( j = L[i-1]; j <= i; j++ )
{
ok[v[j]] -= 1;
if ( ok[v[j]] == 0 ) nr--;
if ( nr == l-1 )
{
L[i] = j+1;
break;
}
}
}
else L[i] = L[i-1];
total2 += (i-L[i]+1);
}
/* printf("\n");
for ( i = 1; i <= n; i++ )
{
printf("%d ", L[i]);
}*/
printf("%lu",total2-total);
}