Submission #1049557

#TimeUsernameProblemLanguageResultExecution timeMemory
1049557gaurezzzVision Program (IOI19_vision)C++17
100 / 100
13 ms3368 KiB
#include <bits/stdc++.h> #include "vision.h" #define F first #define S second #define ll long long #define nd '\n' using namespace std; ll n,m,k; ll casillas[205][205]; ll columns[205]; ll grupos[205][10]; ll binario1[10]; ll rows[205]; ll grupos2[205][10]; ll binario2[10]; int binario3 [10]; //el siguiente proceso se hace primero para columnas y luego para filas //Armar las columnas //or de los elementos de cada columna //Agrupar las columnas por indice y por potencia de 2 //es decir q vamos a ir uniendo con and cada uno de los segmentos //si un segmento tiene and como verdadero, significa q la segunda casilla esta ahi //Armar los grupos de cada indice vs sus posibilidades por cada potencia //entonces abra q usar and para comprobar que ahi esta la segunda casilla //entonces con esto vamos a tener en binario la diferencia de distancias //cuando ya tengamos en binario las dos diferencias entonces hacemos la suma binaria y ya void diccionario(){ ll x=0; for (ll i=0; i<n; i++){ for (ll k=0; k<m; k++){ casillas[i][k] = x; x++; } } //cout << "Imprimiendo diccionario" << nd; //for (ll i=0; i<n; i++){ // for (ll k=0; k<m; k++) //cout << casillas[i][k] << " "; //cout << nd; //} } void armar_columnas(){ for (ll k=0; k<m; k++){ vector <int> armando (n,0); for (ll i=0; i<n; i++){ armando[i] = casillas[i][k]; } columns[k] = add_or(armando); //cout << "Armando " << k << nd; //for (ll i=0; i<n; i++) //cout << armando[i] << " "; //cout << nd; } //cout << "indices columnas" << nd; //for (ll i=0; i<m; i++){ //cout << columns[i] << " "; //} //cout << nd; for (ll k=0; k<m; k++){ ll exp=0; for (ll pot=1; pot<m; pot*=2, ++exp){ vector <int> armando; for (ll rec=0; rec<pot; rec++){ if (rec+k >= m) break; armando.push_back(columns[rec+k]); } //cout << "indice: " << k << nd; //cout << "potencia: " << pot << nd; //for (ll i=0; i<(ll)armando.size(); i++) //cout << armando[i] << ' '; //cout << nd; grupos[k][exp] = add_or(armando); } } //cout << "grupos" << nd; //for (ll i=0; i<m; i++){ //for (ll k=0; k<10; k++) //cout << grupos[i][k] << " "; //cout << nd; //} } // or d etodas las posibilidades por indice // and y luego la casilla de todas las posibilidades // or de todos los and void armar_binario1(){ ll exp=0; for (ll pot=1; pot<m; pot*=2, ++exp){ //cout << "pot " << pot << nd; vector <int> columnspos; for (ll c1=0; c1<m; c1++){ vector <int> armando; ll c2=c1+pot; for (; c2 < m; c2+=pot*2){ if (grupos[c2][exp] != 0) armando.push_back(grupos[c2][exp]); } //cout << "Armando" << nd; //for (ll i=0; i<(ll)armando.size(); i++) //cout << armando[i] << " "; //cout << nd; if (armando.empty()) break; ll casilla = add_or(armando); columnspos.push_back(add_and({(int)columns[c1], (int)casilla})); } binario1[exp] = add_or(columnspos); //cout << "columnspos "<< nd; //for (ll i=0; i<(ll)columnspos.size(); i++) //cout << columnspos[i] << " "; //cout << nd; //cout << "binario 1 "<< nd; //for (ll i=0; i<10; i++) //cout << binario1[i] << " "; //cout << nd; } } void armar_filas(){ for (ll k=0; k<n; k++){ vector <int> armando (m,0); for (ll i=0; i<m; i++){ armando[i] = casillas[k][i]; } rows[k] = add_or(armando); //cout << "Armando " << k << nd; //for (ll i=0; i<m; i++) //cout << armando[i] << " "; //cout << nd; } //cout << "indices filas" << nd; //for (ll i=0; i<n; i++){ //cout << rows[i] << " "; //} //cout << nd; for (ll k=0; k<n; k++){ ll exp=0; for (ll pot=1; pot<n; pot*=2, ++exp){ vector <int> armando; for (ll rec=0; rec<pot; rec++){ if (rec+k >= n) break; armando.push_back(rows[rec+k]); } //cout << "indice: " << k << nd; //cout << "potencia: " << pot << nd; //for (ll i=0; i<(int)armando.size(); i++) //cout << armando[i] << ' '; //cout << nd; grupos2[k][exp] = add_or(armando); } } //cout << "grupos" << nd; //for (ll i=0; i<m; i++){ // for (ll k=0; k<10; k++) //cout << grupos2[i][k] << " "; //cout << nd; //} } void armar_binario2(){ ll exp=0; for (ll pot=1; pot<n; pot*=2, ++exp){ vector <int> filaspos; for (ll c1=0; c1<n; c1++){ vector <int> armando; ll c2=c1+pot; for (; c2 < n; c2+=pot*2){ if (grupos2[c2][exp] != 0) armando.push_back(grupos2[c2][exp]); } //cout << "Armando" << nd; //for (ll i=0; i<(ll)armando.size(); i++) //cout << armando[i] << " "; //cout << nd; if (armando.empty()) break; ll casilla = add_or(armando); filaspos.push_back(add_and({(int)rows[c1], (int)casilla})); } binario2[exp] = add_or(filaspos); //cout << "filaspos "<< nd; //for (ll i=0; i<(ll)filaspos.size(); i++) //cout << filaspos[i] << " "; //cout << nd; //cout << "binario 2 "<< nd; //for (ll i=0; i<10; i++) //cout << binario2[i] << " "; //cout << nd; } } void columnas(){ armar_columnas(); armar_binario1(); } void filas(){ armar_filas(); armar_binario2(); } void sumar (){ int operaciones[9]; int ant; ant=0; //for (int i=0; i<10; i++) //cout << binario1[i] << " "; //cout << nd; //for (int i=0; i<10; i++) //cout << binario2[i] << " "; //cout << nd; int cero = add_and({add_not(0), 0}); if (binario1[0] == 0) binario1[0] = cero; if (binario2[0] == 0) binario2[0] = cero; operaciones[4] = add_or({(int)binario1[0], (int)binario2[0]}); operaciones[5] = add_and({(int)binario1[0], (int)binario2[0]}); operaciones[6] = add_not(operaciones[5]); binario3[0] = add_and({operaciones[4], operaciones[6]}); ant = operaciones[5]; for (ll i=1; i<10; i++){ if (binario1[i] == 0) binario1[i] = cero; if (binario2[i] == 0) binario2[i] = cero; operaciones[0] = add_and({ant, (int)binario1[i]}); operaciones[1] = add_or({ant, (int)binario1[i]}); operaciones[2] = add_not(operaciones[0]); operaciones[3] = add_and({operaciones[1], operaciones[2]}); operaciones[4] = add_or({operaciones[3], (int)binario2[i]}); operaciones[5] = add_and({operaciones[3], (int)binario2[i]}); operaciones[6] = add_not(operaciones[5]); binario3[i] = add_and({operaciones[4], operaciones[6]}); ant = add_or({operaciones[0],operaciones[5]}); } } void comparar(){ int aux = add_not(0); int uno = add_or({0,aux}); bitset<10> kBinario (k); vector <int> r(10); for (int i=0; i<10; i++){ if (kBinario[i]){ r[i] = add_and({binario3[i], uno}); } else{ r[i] = add_not({binario3[i]}); } } add_and(r); } void construct_network(int H, int W, int K) { n=H, m=W, k=K; diccionario(); columnas(); filas(); sumar(); comparar(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...