# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1170068 | niepamietamhasla | Naan (JOI19_naan) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
#include "minerals.h"
void rozw(vector<int> lewo, vector<int> prawo, bool c){
if(lewo.size() == 0 and prawo.size() == 0) return;
if(lewo.size() == 1 and prawo.size() == 1) { Answer(lewo[0], prawo[0]); return; }
if(lewo.size() == 2 and prawo.size() == 2){
if(c){
int curr = Query(lewo[0]);
int nowy = Query(prawo[0]);
if(nowy != curr){
Answer(lewo[0], prawo[0]);
Answer(lewo[1], prawo[1]);
return;
}
else{
Answer(lewo[0], prawo[1]);
Answer(lewo[1], prawo[0]);
return;
}
}
else{
int curr = Query(lewo[0]);
int nowy = Query(prawo[0]);
if(nowy == curr){
Answer(lewo[0], prawo[0]);
Answer(lewo[1], prawo[1]);
return;
}
else{
Answer(lewo[0], prawo[1]);
Answer(lewo[1], prawo[0]);
return;
}
}
}
int mid = lewo.size() / 2;
// for(auto u : lewo){
// cerr << u << " ";
// }
// cout << " lew\n";
// for(auto u : prawo){
// cerr << u << " ";
// }
// cout << " praw\n";
vector<int> l1;
vector<int> l2;
vector<int> p1;
vector<int> p2;
int poprz = -1;
for(int i = 0; i < mid; ++i){
poprz = Query(lewo[i]);
l1.push_back(lewo[i]);
}
for(int i = mid; i < lewo.size(); ++i){
l2.push_back(lewo[i]);
}
for(int i = 0; i < prawo.size(); ++i){
int nowy = Query(prawo[i]);
if(c){
if(nowy == poprz){
p2.push_back(prawo[i]);
}
else{
p1.push_back(prawo[i]);
}
}
else{
if(nowy == poprz){
p1.push_back(prawo[i]);
}
else{
p2.push_back(prawo[i]);
}
}
poprz = nowy;
}
rozw(l1, p1, c ^ 1);
rozw(l2, p2, c);
}
void Solve(int N){
vector<int> lewo;
vector<int> prawo;
int prev = 0;
for(int i = 1; i <= 2 * N; ++i){
int ile = Query(i);
if(ile != prev){
lewo.push_back(i);
}
else{
prawo.push_back(i);
}
prev = ile;
}
rozw(lewo, prawo, 1);
}