Cod sursa(job #13076)

Utilizator cos_minBondane Cosmin cos_min Data 5 februarie 2007 16:09:08
Problema Secventa 5 Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.49 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 int> v;
vector<unsigned long int> ok;
vector<unsigned long int> L;
unsigned long int n;
unsigned long int l,u;

void ReadData();

int main()
{
    ReadData();
    
    return 0;
}

void ReadData()
{
     map<unsigned long int,unsigned long int> s;
     
     unsigned long int i, j;
     
     freopen(in,"r",stdin);
     freopen(out,"w",stdout);
     
     scanf("%lu%lu%lu",&n,&l,&u);
     
     v.resize(n+1);
     ok.resize(n+2);
     L.resize(n+1);
     
     for ( i = 1; i <= n; i++ )
     {
         scanf("%lu", &v[i]);
         ok[i] = v[i];
     }   
     
     sort( ok.begin(), ok.end() );
     
     unsigned long int k = 0;
     for ( i = 1; i <= n; i++ )
     {
         if ( ok[i] == ok[i+1] && i < n ) k++;
         s[ok[i]] = i-k; 
     }
     
     for ( i = 1; i <= n; i++ )
     {
         v[i] = s[v[i]];
         ok[i] = 0;
     }
     
     // pt l-1
     
     unsigned long int 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--;
                  if ( nr == l-1 ) 
                  {
                       L[i] = j+1; 
                       break;
                  }
              }
         }
         else L[i] = L[i-1];   
         total += (i-L[i]+1); 
     }
     
     for ( i = 1; i <= n; i++ ) ok[i] = 0;
     
     // pt u
     
     nr=1; 
     unsigned long 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 == u ) 
                  {
                       L[i] = j+1; 
                       break;
                  }
              }
         }
         else L[i] = L[i-1];   
         total2 += (i-L[i]+1); 
     }
     
     total2-=total;
     
     printf("%lu",total2);
}