Pagini recente » Cod sursa (job #267085) | Cod sursa (job #2212264) | Cod sursa (job #1545904) | Cod sursa (job #63613) | Cod sursa (job #2609069)
#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';
}
}
}