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 <set>
#include <vector>
std::set<int> Adj[1001];
std::vector<int> edges[1001];
std::vector<int> groups[4];
int part[1001];
int threeQuery(int x, int y, int z) {
std::vector<int> q;
q.push_back(x);
q.push_back(y);
q.push_back(z);
return Query(q);
}
int queryRange(int l, int r, int group) {
if(r-l < 1)
return r-l+1;
std::vector<int> q;
for(int i = l; i <= r; i++)
q.push_back(groups[group][i]);
return Query(q);
}
int queryRange(int l, int r, int x, int group) {
std::vector<int> q;
for(int i = l; i <= r; i++)
q.push_back(groups[group][i]);
q.push_back(x);
return Query(q);
}
int count(int l, int r, int x, int group) {
return (r-l+2) - queryRange(l, r, x, group);
}
int bs(int x, int l, int r, int group) {
if(l == r) {
Adj[x].insert(groups[group][l]);
Adj[groups[group][l]].insert(x);
return l;
}
int m = (l+r)/2;
int cl = count(l, m, x, group);
if(cl)
bs(x, l, m, group);
else
bs(x, m+1, r, group);
}
void Solve(int N) {
for(int i = 1; i <= 2*N; i++) {
for(int j = 0; j < 4; j++) {
groups[j].push_back(i);
if(queryRange(0, groups[j].size()-1, j) == groups[j].size()) {
part[i] = j;
break;
}
else
groups[j].pop_back();
}
}
for(int i = 1; i <= 2*N; i++) {
for(int j = 0; j < part[i]; j++) {
int last = 0;
do {
last = bs(i, last, groups[j].size()-1, j)+1;
} while(last < groups[j].size() && Adj[i].size() < 3 && count(last, groups[j].size()-1, i, j));
}
}
for(int i = 1; i <= 2*N; i++) {
if(Adj[i].size() == 3) {
for(std::set<int>::iterator it = Adj[i].begin(); it != Adj[i].end(); it++) {
edges[i].push_back(*it);
}
}
}
for(int i = 1; i <= 2*N; i++) {
if(edges[i].size() == 3) {
int x0 = threeQuery(i, edges[i][1], edges[i][2]);
int x1 = threeQuery(i, edges[i][0], edges[i][2]);
int x;
if(x0 == 1)
x = edges[i][0];
else if(x1 == 1)
x = edges[i][1];
else
x = edges[i][2];
Adj[x].erase(i);
Adj[i].erase(x);
}
}
for(int i = 1; i <= 2*N; i++) {
int j = *Adj[i].begin();
if(i < j)
Answer(i, j);
}
}
Compilation message (stderr)
chameleon.cpp: In function 'void Solve(int)':
chameleon.cpp:61:47: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if(queryRange(0, groups[j].size()-1, j) == groups[j].size()) {
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~
chameleon.cpp:75:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
} while(last < groups[j].size() && Adj[i].size() < 3 && count(last, groups[j].size()-1, i, j));
~~~~~^~~~~~~~~~~~~~~~~~
chameleon.cpp: In function 'int bs(int, int, int, int)':
chameleon.cpp:55:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
# | 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... |