제출 #1073592

#제출 시각아이디문제언어결과실행 시간메모리
1073592Itamar열쇠 (IOI21_keys)C++17
0 / 100
1 ms348 KiB
using namespace std; #include <vector> #define vi vector<int> #include <map> #include<set> #include<algorithm> #include<queue> const int siz = 3e1+2; int my[siz]; int fun[siz]; vi que[siz]; vi col[siz]; map<int,vi> locked[siz]; int fin[siz]; set<int> keys[siz]; set<int> s; int n; int root[siz]; void kil(int c){ fin[c]=2; if(s.find(c)!=s.end())s.erase(c); } void con(int a, int b){ a = my[a], b = my[b]; if(a==b)return; if(col[a].size() > col[b].size())swap(a,b); for(int k : keys[a]){ for(int l : locked[b][k]){ que[b].push_back(l); } locked[b][k].clear(); keys[b].insert(k); } for(auto[l,v] : locked[a]){ if(keys[b].find(l)!=keys[b].end()){ for(int i : v)que[b].push_back(i); }else{ for(int i : v)locked[b][l].push_back(i); } } for(int i : que[a])que[b].push_back(i); for(int i : col[a]){ my[i]=b; col[b].push_back(i); } } void topo(map<int,int>& deg, int i){ int f = my[fun[i]]; deg[f]--; if(deg[f]==0)topo(deg,i); } int findr(int f){ if(root[f]==f)return f; root[f] = findr(fun[f]); return root[f]; } void iter(){ for(int i = 0; i < n; i++)root[i]=i; for(int i = 0; i < n; i++)fun[i]=i; for(int i = 0; i < n; i++){ if(root[i]==i){ int m = my[i]; while(que[m].size()){ int f = que[m].back(); que[m].pop_back(); if(f!=i){ if(findr(f)==i){ while(f!=i){ con(f,fun[f]); f=fun[f]; } }else{ root[i]=f; fun[i]=f; break; } } } } } } vi find_reachable(vi R, vi U,vi V,vi C){ n = R.size(); for(int i = 0; i < n; i++)fun[i]=i; for(int i = 0; i < n; i++){ my[i]=i; col[i].push_back(i); keys[i].insert(R[i]); s.insert(i); } for(int i = 0; i < U.size(); i++){ int a = U[i], b = V[i]; if(*keys[a].begin() == C[i]){ que[a].push_back(b); }else{ locked[a][C[i]].push_back(b); } if(*keys[b].begin() == C[i]){ que[b].push_back(a); }else{ locked[b][C[i]].push_back(a); } } iter(); vi ans(n); int mini = 1e9; for(int i = 0; i < n; i++){ if(root[i]==i)mini = min(mini,(int)col[my[i]].size()); } for(int i =0 ; i< n; i++){ if(root[i]==i){ if(col[my[i]].size() == mini){ for(int j : col[my[i]])ans[j]=1; } } } return ans; }

컴파일 시 표준 에러 (stderr) 메시지

keys.cpp: In function 'std::vector<int> find_reachable(std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
keys.cpp:100:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  100 |     for(int i = 0; i < U.size(); i++){
      |                    ~~^~~~~~~~~~
keys.cpp:122:34: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  122 |             if(col[my[i]].size() == mini){
      |                ~~~~~~~~~~~~~~~~~~^~~~~~~
#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...