#include #include #include #include #include #include #include using namespace std; int count_sets(const vector &v); double drand() { return double(rand())/double(RAND_MAX); } // Poner a 1 para imprimir los vectores por pantalla int VRBS=1; // verbosity level int main() { int N,M,xmax,ntimes; #if 1 || defined(DOMJUDGE) N=1000000; // Numero de conjuntos M=5; // Tamano maximo de los conjuntos xmax=-1; // Maximo elemento del conjunto (-1 indica infinito) ntimes=40; // Number of times the problem is repeated VRBS=0; #else // Caso de prueba N=20; // Numero de conjuntos M=6; // Tamano maximo de los conjuntos xmax=10; // Maximo elemento del conjunto (-1 indica infinito) ntimes=1; // Number of times the problem is repeated VRBS=1; #endif double frac = 0.1; // Controla la cantidad de sets repetidos // Generamos N conjuntos aleatorios int vsets_sz = N; vector< set > vsets(vsets_sz); srand(19400310); // seed = CN birth date, LOL!! for (int j=0; j &s = vsets[j]; for (int k=0; k0) x %= xmax; s.insert(x); } } // Lo repetimos ntimes veces, solo para medir // mejor los tiempos for (int m=0; m indices(N),indices1; for (int j=0; j v; int next = 0; for (int j=0; j &s = vsets[k]; set::iterator q = s.begin(); while (q!=s.end()) v.push_back(*q++); random_shuffle(v.begin()+next,v.end()); v.push_back(-1); next = v.size(); } if (VRBS) { unsigned int j=0, js=0; while(j=0) printf("%d ",v[j++]); printf("}\n"); j++; js++; } printf("fin de los conjuntos -----------\n"); } if (VRBS) printf("Numero de conjuntos distintos "); printf("%d\n",count_sets(v)); } return 0; } //================================================================ // PARTICIPANTES DEL TORNEO SOLO DEBERIAN MODIFICAR // DE AQUI PARA ABAJO //================================================================ int count_sets(const vector &v) { set< set > ssets; unsigned int j=0; while(j s; while (v[j]>=0) s.insert(v[j++]); j++; ssets.insert(s); } return ssets.size(); }