Cod sursa(job #13018)

Utilizator cos_minBondane Cosmin cos_min Data 5 februarie 2007 14:16:19
Problema Secventa 5 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.77 kb
#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;
     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 ( int i = 1; i <= n; i++ )
     {
         scanf("%lu", &v[i]);
         ok[i] = v[i];
     }   
     
     sort( ok.begin(), ok.end() );
     
     int k = 0;
     for ( int i = 1; i <= n; i++ )
     {
         if ( ok[i] == ok[i+1] && i < n ) k++;
         s[ok[i]] = i-k; 
     }
     
     sel.resize(n-k);
     
     for ( int 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 ( int i = 2; i <= n; i++ )
     {
         ok[v[i]] += 1;
         if ( ok[v[i]] == 1 ) nr++;
         
         if ( nr > l-1 )
         {
              for ( int 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 ( int i = 1; i <= n; i++ ) 
     {
         printf("%d ", L[i]);
     }*/
     
     
     for ( int 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 ( int i = 2; i <= n; i++ )
     {
         ok[v[i]] += 1;
         if ( ok[v[i]] == 1 ) nr++;
         
         if ( nr > u )
         {
              for ( int 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 ( int i = 1; i <= n; i++ ) 
     {
         printf("%d ", L[i]);
     }*/
     
     printf("%lu",total2-total);
}