Cod sursa(job #2609069)

Utilizator KPP17Popescu Paul KPP17 Data 2 mai 2020 09:24:01
Problema Hashuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.99 kb
#define fisier "hashuri"
#include <fstream>
std::ifstream in(fisier ".in");
std::ofstream out(fisier ".out");

// cine spune ca trebuie sa definesc functia hash cu un mod?
// daca o fac cu un div nu ar trebui sa obtin un efect similar?
// din cate am inteles nu ne intereseaza decat sa impartim numerele in grupe, prin proprietati comune care sunt usor de verificat
// ex: numerele cu proprietatea ca sunt congruente cu 15, mod 666013 sa fie in grupa lor, etc
// le voi impartii in x grupe, fiecare grupa i va reprezenta numerele cu proprietatea ca n/DIV == i.

// trebuie sa facem un echilibru intre numarul de vectori si memoria maxima
// problema este ca un obiect std::vector<int> consuma si el niste memorie chiar daca nu are elemente
// diferenta dintre memoria maxima si GRUPE * memoria_consumata_de_un_vector_gol trebuie sa fie egala cu N

// GRUPE * MEM_PER_STDVECTOR + N <= MAX_MEM
// adica


#include <vector>
const int
VAL = 2000000000,
N = 1000000,
MAX_MEM = (65536 * 1024) / 4,

EXTRA_SPATIU = 2, // asta o voi manevra eu sa vad cat trebuie crescuta ca sa nu iasa din memorie

SIZEOF_STDVECTOR = sizeof(std::vector<int>),
MEM_PER_STDVECTOR = SIZEOF_STDVECTOR / 4 + bool(SIZEOF_STDVECTOR % 4) + EXTRA_SPATIU,
GRUPE = (MAX_MEM - N) / MEM_PER_STDVECTOR,
DIV = VAL / (GRUPE - 1); // VAL / DIV == GRUPE - 1

std::vector<int> grupe[GRUPE];
#include <algorithm>

int main()
{
    int n; in >> n;
    while (n--)
    {
        int op, x; in >> op >> x;
        std::vector<int>& grupa = grupe[x / DIV];
        std::vector<int>::iterator poz_x = std::find(grupa.begin(), grupa.end(), x);
        bool exista = poz_x != grupa.end();

        switch (op)
        {
            case 1:
                if (!exista)
                    grupa.push_back(x);
                break;

            case 2:
                if (exista)
                    grupa.erase(poz_x);
                break;

            case 3:
                out << exista << '\n';
        }
    }
}