Cod sursa(job #10786)

Utilizator ZeusCatalin Tiseanu Zeus Data 29 ianuarie 2007 14:54:34
Problema Secventa 5 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb

using namespace std;

#include <cstdio>
#include <map>
#include <iostream>
#include <cstring>
#include <algorithm>

int N, L, U, cnt[ 1<<20 + 1 ];
unsigned int A[1<<20+2];
int B[1<<20+2], C[1<<20+2];

bool cmp ( const int & x1, const int & x2 ) 
{
    return A[x1] < A[x2];
}       

void resort()
{
//     memcpy( B, A, sizeof( A ) );
     
     for( int i = 1; i <= N; i++ )
          B[i] = i;
     
     sort( B + 1, B + N + 1, cmp );   
     
     int j = 1, k, cnt = 1;
     
     for( int i = 1; i <= N; i++ )
     {
         for( j = i; j <= N && A[ B[i] ] == A[ B[j] ]; j++ );
         k = --j;
         while( j >= i ) A[ B[j] ] = cnt, j--;
         i = k;
         ++cnt;      
     }    
}

long long doit( int LEN )
{
     long long ret = 0;
     
     int r = 0, dist = 0;
     
     bool can;
     
     memset( cnt, 0, sizeof( cnt ) );

     for( int i = 1; i <= N; i++ )
     {
         while( r + 1 <= N  )
         {
                if( !(cnt[ A[r+1] ] || dist + 1 <= LEN ) )
                   break;
                
                dist += !cnt[ A[r+1] ];
                    
                cnt[ A[r+1] ]++;  
                
                ++r;    
         }       
         
         cnt[ A[i] ]--;
         
         if( !cnt[A[i]] )
             dist--;
         
         ret += (long long)( r ) - i + 1;
     }
     
     return ret;
}

int main()
{
    freopen("secv5.in", "r", stdin);
    freopen("secv5.out", "w", stdout);
    
    char buf[12];
    
    char * p;
    
    
    scanf("%d %d %d \n", &N, &L, &U);
    for( int i = 1; i <= N; i++ )
    {
         gets( buf );
         for( p = buf; *p != '\0'; p++ )
              A[i] = A[i] * 10 + (*p) - '0';        
//         cout << A[i] << endl;    
//         scanf("%ud", A + i );
    }
    
    resort();
    
    cout << doit( U ) - doit( L - 1 ) << endl;
    
    return 0;
}