Submission #594722

#TimeUsernameProblemLanguageResultExecution timeMemory
594722DeepessonVision Program (IOI19_vision)C++17
44 / 100
7 ms1236 KiB
#include <bits/stdc++.h> void construct_network(int H, int W, int K); int add_and(std::vector<int> Ns); int add_or(std::vector<int> Ns); int add_xor(std::vector<int> Ns); int add_not(int N); int tiles[505][505]; void plotar_tiles(int H,int W){ for(int i=0;i!=H;++i){ for(int j=0;j!=W;++j){ tiles[i][j]=(i*W)+j; } } } ///Ideia: Caso o AND desses 2 caras sejam positivos a conexao eh invalida std::vector<int> gerar_lista_dist(int H,int W,int a,int b,int K){ std::vector<int> queue; for(int i=0;i!=H;++i){ for(int j=0;j!=W;++j){ int d = abs(i-a)+abs(j-b); if(d==K)queue.push_back(tiles[i][j]); } } return queue; } std::vector<std::vector<int>> lista; std::vector<int> niveis[15][2]; void divide(int l,int r,int pos=0){ if(l==r)return; int m = (l+r)/2; for(int i=l;i<=m;++i){ for(auto&x:lista[i]) niveis[pos][0].push_back(x); } for(int i=m+1;i<=r;++i){ for(auto&x:lista[i]) niveis[pos][1].push_back(x); } divide(l,m,pos+1); divide(m+1,r,pos+1); } int avanca_conquista(void){ std::vector<int> andao; divide(0,lista.size()-1,0); for(int i=0;i!=15;++i){ if(!niveis[i][0].size())break; int a = add_or(niveis[i][0]); int b = add_or(niveis[i][1]); std::vector<int> k = {a,b}; andao.push_back(add_xor(k)); } for(int i=0;i!=15;++i)for(int j=0;j!=2;++j)niveis[i][j].clear(); lista.clear(); return add_and(andao); } bool ok[505][505]={}; void construct_network(int H, int W, int K) { plotar_tiles(H,W); ///Min(H,W) == 1 if(std::min(H,W)==1){ if(H==1){ int count=0; for(int i=0;i!=W;++i){ int esperado = i+K; if(esperado>=W)break; std::vector<int> v; v.push_back(tiles[0][i]); v.push_back(tiles[0][esperado]); add_and(v); ++count; } std::vector<int> orzao; for(int i=0;i!=count;++i)orzao.push_back(H*W+i); add_or(orzao); }else { assert(W==1); int count=0; for(int i=0;i!=H;++i){ int esperado = i+K; if(esperado>=H)break; std::vector<int> v; v.push_back(tiles[i][0]); v.push_back(tiles[esperado][0]); add_and(v); ++count; } std::vector<int> orzao; for(int i=0;i!=count;++i)orzao.push_back(H*W+i); add_or(orzao); } }else if(std::max(H,W)<=31){ int count=0; for(int i=0;i!=H;++i){ for(int j=0;j!=W;++j){ std::vector<int> res = gerar_lista_dist(H,W,i,j,K); if(!res.size())continue; ok[i][j]=1; add_or(res); ++count; } } std::vector<int> orzao; int anda=0; for(int i=0;i!=H;++i){ for(int j=0;j!=W;++j){ if(!ok[i][j])continue; std::vector<int> res; res.push_back(tiles[i][j]); res.push_back(H*W+anda); ++anda; add_and(res); orzao.push_back(H*W+count); ++count; } } add_or(orzao); }else if(K==1){ std::vector<int> orfinal; for(int i=0;i!=H-1;++i){ for(int j=0;j!=W;++j){ if(i&1)continue; std::vector<int> v; v.push_back(tiles[i][j]); v.push_back(tiles[i+1][j]); } } orfinal.push_back(avanca_conquista()); for(int i=0;i!=H-1;++i){ for(int j=0;j!=W;++j){ if(!(i&1))continue; std::vector<int> v; v.push_back(tiles[i][j]); v.push_back(tiles[i+1][j]); } } orfinal.push_back(avanca_conquista()); for(int i=0;i!=H;++i){ for(int j=0;j!=W-1;++j){ if((j&1))continue; std::vector<int> v; v.push_back(tiles[i][j]); v.push_back(tiles[i][j+1]); } } orfinal.push_back(avanca_conquista()); for(int i=0;i!=H;++i){ for(int j=0;j!=W-1;++j){ if(!(j&1))continue; std::vector<int> v; v.push_back(tiles[i][j]); v.push_back(tiles[i][j+1]); } } orfinal.push_back(avanca_conquista()); add_or(orfinal); }else{///Pixel no canto superior esquerdo std::vector<int> lista; for(int i=0;i!=H;++i) for(int j=0;j!=W;++j){ if(i+j==K){ lista.push_back(tiles[i][j]); } } add_or(lista); } }
#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...