Cod sursa(job #857998)

Utilizator veleanduAlex Velea veleandu Data 18 ianuarie 2013 14:33:32
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda ichb-locala-2013-10 Marime 2.21 kb
#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");

unsigned int n,l,u;
unsigned int i,j,a;
unsigned int Sir[ max_n ];
pair< unsigned int ,unsigned int > SirS[ max_n ];
long long rez;
unsigned int Next[ max_n ];
bool Count[ max_n ];
unsigned 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++;
        }
    }
    unsigned 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 ];
	}
	
    unsigned 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;
}