이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
#include "icc.h"
#define bug(x) cerr<<#x<<" = "<<x<<endl
using namespace std;
const int N = 105;
//bool query(int n, int m, int a[], int b[]) {
// bool ok;
// cout<<"ask\n";
// cout<<"a ";
// for (int i = 0; i < n; ++i)
// cout<<a[i]<<' ';
// cout<<endl;
// cout<<"b ";
// for (int i = 0; i < m; ++i)
// cout<<b[i]<< ' ';
// cout<<endl;
// cin >> ok;
// return ok;
//}
//
//void setRoad(int u, int v) {
// cout<<"is "<<u<<' '<<v<<endl<<endl;
//}
int par[N];
vector<int> vec[N];
int find(int u) {
return (par[u] == u) ? u : par[u] = find(par[u]);
}
void join(int u, int v) {
u = find(u), v = find(v);
if (vec[u].size() > vec[v].size()) swap(u, v);
for (auto i : vec[u]) vec[v].push_back(i);
par[u] = v, vec[u].clear();
}
bool query(vector<int> a, vector<int> b) {
int sza = a.size(), szb = b.size();
if (sza <= 0 || szb <= 0) return 0;
int A[N], B[N];
for (int i = 0; i < sza; ++i) A[i] = a[i];
for (int i = 0; i < szb; ++i) B[i] = b[i];
return query(sza, szb, A, B);
}
void find(int l, int r, vector<int> &go, vector<int>& to) {
if (l == r) {
int tmp = go[l]; go.clear(); go.push_back(tmp); return;
}
int mid = (l + r) >> 1;
vector<int> a, b; b = to;
for (int i = l; i <= mid; ++i) a.push_back(go[i]);
if (query(a, b)) find(l, mid, go, to);
else find(mid + 1, r, go, to);
}
void cal(vector<int> vx, vector<int> vy) {
if (vx.empty() || vy.empty()) return;
find(0, vx.size() - 1, vx, vy);
find(0, vy.size() - 1, vy, vx);
setRoad(vx[0], vy[0]), join(vx[0], vy[0]);
}
void run(int n) {
for (int i = 1; i <= n; ++i) par[i] = i, vec[i].push_back(i);
for (int t = 1; t < n; ++t) {
vector<int> go;
for (int i = 1; i <= n; ++i)
if (find(i) == i) go.push_back(i);
// cout<<"GO = "<<endl;
// for (int x : go) cout<<x<<' ';
// cout<<endl;
int sz = go.size(), m = 0, id, A = 0, B = 0; /// m = A xor B
for (int i = 0; (1 << i) < sz; ++i) {
vector<int> a, b;
for (int j = 0; j < sz; ++j) {
if ((j >> i) & 1) {
for (int k : vec[go[j]]) a.push_back(k);
} else {
for (int k : vec[go[j]]) b.push_back(k);
}
}
if (query(a, b)) m |= (1 << i), id = i;
}
B |= (1 << id);
for (int i = 0; (1 << i) < sz; ++i) if (i != id) {
if ((m >> i) & 1) {
vector<int> a, b;
for (int j = 0; j < sz; ++j) {
if ( (((j >> i) & 1) == 0) && (((j >> id) & 1) == 0) ) {
for (int k : vec[go[j]]) a.push_back(k);
}
if ( (((j >> i) & 1) == 1) && (((j >> id) & 1) == 1) ) {
for (int k : vec[go[j]]) b.push_back(k);
}
}
if (query(a, b)) {
B |= (1 << i);
} else
A |= (1 << i);
} else {
vector<int> a, b;
for (int j = 0; j < sz; ++j) if (((j >> i) & 1) == 0) {
if (j >> id & 1) {
for (int k : vec[go[j]]) a.push_back(k);
} else {
for (int k : vec[go[j]]) b.push_back(k);
}
}
if (query(a, b) == 0) {
A |= (1 << i);
B |= (1 << i);
}
}
}
cal(vec[go[A]], vec[go[B]]);
}
}
//
//int main() {
// int n; cin >> n;
// run(n);
//}
컴파일 시 표준 에러 (stderr) 메시지
icc.cpp: In function 'void run(int)':
icc.cpp:90:17: warning: 'id' may be used uninitialized in this function [-Wmaybe-uninitialized]
90 | B |= (1 << id);
| ~~~^~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |