This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "chameleon.h"
#include <bits/stdc++.h>
using namespace std;
const int N = 5e3 + 12;
vector<int> g[N];
int n;
void make(vector<int> &l,vector<int> &r,int i) {
l.clear();
r.clear();
vector<int> d(N,0);
vector<int> x,y;
function<void(int)>dfs = [&](int v) {
if(d[v] & 1) {
x.push_back(v);
} else {
y.push_back(v);
}
for(int to:g[v]) {
if(!d[to]) {
d[to] = d[v] + 1;
dfs(to);
}
}
};
for(int j = 1;j < i;j++) {
if(!d[j]) {
d[j] = 1;
x.clear();
y.clear();
dfs(j);
if((int)x.size() < (int)y.size()) {
x.swap(y);
}
for(int j:x ) {
l.push_back(j);
}
for(int j:y ) {
r.push_back(j);
}
}
}
}
bool vis[N];
int to[N],fr[N];
set<int> st[N];
void Solve(int n_) {
n = n_;
vector<int> l,r;
for(int i = 2;i <= n + n;i++) {
make(l,r,i);
auto ed = [&](vector<int> &x) -> void{
int it = 0,m = (int)x.size();
while(it < m) {
if((int)g[i].size() == 3) break;
int l = it - 1,r = m;
while(r - l > 1) {
int mid = (l + r) >> 1;
vector<int> t(1,i);
for(int j = it; j <= mid; ++j) {
t.push_back(x[j]);
}
if(Query(t) != (int)t.size()) {
r = mid;
} else {
l = mid;
}
}
if(r != m) {
g[i].push_back(x[r]);
g[x[r]].push_back(i);
}
if((int)g[i].size() == 3) break;
it = r + 1;
}
};
ed(l);
ed(r);
}
for(int i = 1;i <= n + n;i++) {
if(vis[i]) continue;
if(g[i].size() == 1) {
Answer(i,g[i][0]);
vis[i] = vis[g[i][0]] = 1;
}
}
for(int i = 1;i <= n + n;i++) {
if(vis[i]) continue;
for(int j:g[i]) {
if(vis[j]) continue;
st[i].insert(j);
}
}
for(int i = 1;i <= n + n;i++) {
if(vis[i]) continue;
if((int)st[i].size() == 1) continue;
if((int)g[i].size() >= 2 &&Query({i,g[i][0],g[i][1]}) == 1) {
st[i].erase(g[i][2]);
st[g[i][2]].erase(i);
} else if(g[i].size() >= 3 && Query({i,g[i][2],g[i][1]}) == 1) {
st[i].erase(g[i][0]);
st[g[i][0]].erase(i);
} else if(g[i].size() >= 3 && Query({i,g[i][0],g[i][2]}) == 1){
st[i].erase(g[i][1]);
st[g[i][1]].erase(i);
}
}
for(int i = 1;i <= n + n;i++) {
if(vis[i] || st[i].empty()) continue;
int t = (*st[i].begin());
Answer(i,t);
vis[i] = vis[t] = 1;
}
}
# | 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... |