Pagini recente » Cod sursa (job #2671320) | Cod sursa (job #2295541) | Cod sursa (job #534451) | Cod sursa (job #721047) | Cod sursa (job #857991)
Cod sursa(job #857991)
#include <cstdio>
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
#define max_n ( (1<<20) + 5 )
ifstream in("secv5.in");
ofstream out("secv5.out");
int n,l,u;
int i,j,a;
int Sir[ max_n ];
pair< int,int > SirS[ max_n ];
long long rez;
int Next[ max_n ];
bool Count[ max_n ];
int ind1,ind2;
bool mysort ( pair<int,int> a , pair<int,int> b ){
if ( a.first < b.first ){
return 1;
}
if ( a.first > b.first ){
return 0;
}
return a.second < b.second;
}
int main(){
in>>n>>u>>l;
l++;
for ( i=1; i<=n; ++i ){
in>>a;
Sir[ i ] = a;
SirS[ i ] = make_pair ( a, i );
}
sort ( SirS+1, SirS+n+1, mysort );
for ( i=1; i<=n; ){
j=i;
Count[ SirS[ i ].second ] = 1;
i++;
while ( i<=n && SirS[i].first == SirS[j].first ){
Next[ SirS[ i-1 ].second ] = SirS[ i ].second;
i++;
}
}
int s=0;
ind1=0;
while ( s < u && ind1<=n ){
ind1++;
s+=Count[ ind1 ];
}
ind2=ind1;
while ( s < l && ind2<=n ){
ind2++;
s+=Count[ ind2 ];
}
int ok=1;
for ( i=1; i<=n && ok; ++i ){
//out<<i<<" "<<ind1<<" "<<ind2<<"\n";
// toate sirurile din ind1 ... ind2-1 inclusiv sunt bune.
rez=(long long)rez+ind2-ind1;
// este scos elementul i
Count[ i ] = 0;
if ( Next[ i ] ){
// daca putem pune
Count[ Next[ i ] ] = 1;
}
if ( Next[ i ] > ind1 || ( !Next[ i ] ) ){
// trebuie iterat ind1 pana mai gasim un count = 1
ind1++;
while ( ind1<=n && !Count[ ind1 ] ){
ind1++;
}
if ( ind1 == n+1 )
ok=0;
// nu am gasit un sir care sa aiba minim 'u' elemente.
}
if ( Next[ i ] > ind2 || ( !Next[ i ] ) ){
ind2++;
while ( ind2<=n && !Count[ ind2 ] ){
ind2++;
}
if ( ind2>n )
ind2=n+1;
// este posibil sa nu avem siruri de 'l' elemente sau mai mici .. dar nu ne deranjeaza.
}
}
out<<rez;
return 0;
}