Cod sursa(job #1048061)

Utilizator UnforgivenMihai Catalin Botezatu Unforgiven Data 5 decembrie 2013 11:10:16
Problema Secventa 5 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.66 kb
#include <iostream>
#include <fstream>
#include <cstdio>
#include <vector>
#include <ctype.h>

const static int NMAX = (1 << 20) + 10;
const static int MODULO = 666013;

using namespace std;

ifstream input("secv5.in");
ofstream output("secv5.out");
int nr_elemente;
int l , u;
unsigned int vect[NMAX];
vector<pair<unsigned int,int> > hashTable[MODULO];
char buffer[NMAX * 13];

void readDataFromInput()
{
	int poz = 0;

    input >> nr_elemente >> l >> u;
    input.getline(buffer,13 * NMAX,EOF);
    for(int i=0; i<nr_elemente; i++)
    {
    	vect[i] = 0;
    	for(poz++;buffer[poz] >= '0' && buffer[poz] <= '9';poz++)
		{
			vect[i] = vect[i] * 10 + (buffer[poz] - '0');
		}
    }
}

void insertOrUpdate(const unsigned int & element)
{
    int key = element % MODULO;
    int i = 0;
    bool was_found = false;

    for (; i<hashTable[key].size() && !was_found; i++)
    {
        if (hashTable[key][i].first == element)
        {
            was_found = true;
            i--;
        }
    }
    if (!was_found)
        hashTable[key].push_back(pair<int,int>(element,1));
    else hashTable[key][i].second++;
}

void decrementValue(const unsigned int & element)
{
    int key = element % MODULO;
    int i = 0;
    bool was_found = false;
    int last = hashTable[key].size();

    for (; i < last && !was_found; i++)
    {
        if (hashTable[key][i].first == element)
        {
            was_found = true;
            i--;
        }
    }
    if (was_found)
	{
        hashTable[key][i].second --;
        if (hashTable[key][i].second == 0)
		{
			swap(hashTable[key][i] , hashTable[key][last-1]);
			hashTable[key].pop_back();
		}
	}
}

bool valueExists(const unsigned int & element)
{

    int key = element % MODULO;
    int i = 0;
    bool was_found = false;

    for (; i<hashTable[key].size() && !was_found; i++)
    {
        if (hashTable[key][i].first == element)
        {
            return true;
        }
    }
    return false;
}

long long nr_secvente(const int & max_diferite)
{
	if (max_diferite == 0) return 0;

    register int left = 0;
    register int right = 0;
    register int nr_diferite = 1;
    register long long secvente = 0;
	insertOrUpdate(vect[0]);

    for (left = 0 ; left < nr_elemente; left++)
    {

        while (right < nr_elemente && nr_diferite <= max_diferite)
        {
			right++;
			if (!valueExists(vect[right])) nr_diferite ++;
			insertOrUpdate(vect[right]);
        }
        secvente += 1LL * (right - left);
        decrementValue(vect[left]);
        if (!valueExists(vect[left])) nr_diferite --;
    }
    return secvente;
}

int main()
{
	readDataFromInput();
	output << nr_secvente(u) - nr_secvente(l-1);
	input.close();
	output.close();
    return 0;
}