Submission #527575

#TimeUsernameProblemLanguageResultExecution timeMemory
527575DeepessonKeys (IOI21_keys)C++17
37 / 100
3089 ms63856 KiB
#include <bits/stdc++.h> #define MAX 305000 int N,M; int chaves[MAX]; typedef std::pair<int,int> pii; std::vector<pii> total[MAX]; std::vector<pii> con[MAX],rev[MAX]; bool vis1[MAX],vis2[MAX]; void conecta(int a,int b,int c){ con[a].push_back({b,c}); rev[b].push_back({a,c}); } void limpar(void){ for(int i=0;i!=MAX;++i){ con[i].clear(); rev[i].clear(); vis1[i]=vis2[i]=0; } } std::vector<int> vec; void dfs1(int pos){ if(vis1[pos])return; vis1[pos]=true; for(auto&x:con[pos]){ dfs1(x.first); } vec.push_back(pos); } std::vector<int> ans; void dfs2(int pos){ if(vis2[pos])return; vis2[pos]=true; for(auto&x:rev[pos]){ dfs2(x.first); } ans.push_back(pos); } std::vector<std::vector<int>> SCC(void){ for(int i=0;i!=N;++i){ if(!vis1[i])dfs1(i); } std::vector<std::vector<int>> resp; while(vec.size()){ int u = vec.back(); vec.pop_back(); if(vis2[u])continue; dfs2(u); resp.push_back(ans); ans.clear(); } return resp; } void Decompor(std::vector<std::vector<int>> k){ limpar(); for(auto&x:k){ std::map<int,bool> keys; for(auto&y:x){ keys[chaves[y]]=true; } for(auto&y:x){ for(auto&z:total[y]){ if(z.second==-1||keys.find(z.second)!=keys.end()){ conecta(y,z.first,z.second); } } } } } std::vector<int> find_reachable(std::vector<int> r, std::vector<int> u, std::vector<int> v, std::vector<int> c) { N = r.size(); for(int i=0;i!=N;++i){ chaves[i]=r[i]; } M = u.size(); for(int i=0;i!=M;++i){ total[u[i]].push_back({v[i],c[i]}); total[v[i]].push_back({u[i],c[i]}); } std::vector<std::vector<int>> prev; for(int i=0;i!=N;++i){ std::vector<int> v; v.push_back(i); prev.push_back(v); } for(;;){ Decompor(prev); std::vector<std::vector<int>> novo = SCC(); // printf("Tamanho Novo: %d\n",novo.size()); if(novo.size()==prev.size())break; // printf("Nova decomposicao!\n"); prev=novo; } std::vector<std::vector<int>> sobra; for(auto&x:prev){ std::map<int,bool> keys,possui; for(auto&y:x){ keys[chaves[y]]=true; possui[y]=true; } for(auto&y:x){ for(auto&z:con[y]){ if(z.second==-1||keys.find(z.second)!=keys.end()){ if(possui.find(z.first)==possui.end()){ goto proxa; } } } } { sobra.push_back(x); } proxa:{} } std::vector<int> respfinal; for(int i=0;i!=N;++i)respfinal.push_back(0); std::vector<std::vector<int>> definitivo; int menor=1e9,total=0; for(auto&x:sobra){ int p = x.size(); if(menor>p){ menor=p; definitivo.clear(); definitivo.push_back(x); }else if(menor==p){ definitivo.push_back(x); } } for(auto&x:definitivo)for(auto&y:x)respfinal[y]=1; return respfinal; }

Compilation message (stderr)

keys.cpp: In function 'std::vector<int> find_reachable(std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
keys.cpp:117:19: warning: unused variable 'total' [-Wunused-variable]
  117 |     int menor=1e9,total=0;
      |                   ^~~~~
#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...