# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
368199 | 2021-02-19T18:51:24 Z | ivan_tudor | CEOI16_icc (CEOI16_icc) | C++14 | 0 ms | 0 KB |
//#include"icc.h" #include<bits/stdc++.h> using namespace std; const int N = 105; int dad[N]; vector<int> memb[N]; int findd(int nod){ if(nod == dad[nod]) return nod; int d = findd(dad[nod]); dad[nod] = d; return dad[nod]; } void join(int x,int y){ x = findd(x); y = findd(y); if(x == y) return; if(memb[x].size() < memb[y].size()){ swap(x, y); swap(memb[x], memb[y]); } for(auto mm:memb[y]){ memb[x].push_back(mm); } } int used[N]; void buildgroups(vector<int> &gra, vector<int> &grb, vector<int> &dads, int bit){ for(int i =0; i<dads.size();i++){ if(i & ( 1<<bit)){ for(auto x:memb[dads[i]]) gra.push_back(x); } else{ for(auto x:memb[dads[i]]) grb.push_back(x); } } } int findx(vector<int> v, vector<int> second){ vector<int> nou; while(v.size() > 1){ int mid = (v.size() -1 )/2; nou.clear(); for(int i = 0; i<=mid;i++) nou.push_back(v[i]); if(query(nou.size(), second.size(), nou.data(), second.data())) v = nou; else v.erase(v.begin(), v.begin() + mid + 1); } return v[0]; } void run(int n){ for(int i=1;i<=n;i++) dad[i] = i, memb[i].push_back(i); for(int nre = 1; nre<n;nre++){ for(int i=1;i<=n;i++) used[i] = 0; vector<int> dads; for(int i = 1; i<=N;i++){ int tata = findd(i); if(used[tata] == true) continue; used[tata] = true; dads.push_back(tata); } int ds = dads.size(); vector<int> gra, grb; for(int bit = 0; (1<<bit) < ds; bit++){ gra.clear(); grb.clear(); buildgroups(gra, grb, dads, bit); if(query(gra.size(), grb.size(), gra.data(), grb.data()) == 1){ int x, y; x = findx(gra, grb); y = findx(grb, gra); setRoad(x, y); join(x, y); break; } } } }