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 "communication.h"
#include <bits/stdc++.h>
using namespace std;
//
// --- Sample implementation for the task communication ---
//
// To compile this program with the sample grader, place:
// communication.h communication_sample.cpp sample_grader.cpp
// in a single folder, then open the terminal in this directory (right-click onto an empty spot in the directory,
// left click on "Open in terminal") and enter e.g.:
// g++ -std=c++17 communication_sample.cpp sample_grader.cpp
// in this folder. This will create a file a.out in the current directory which you can execute from the terminal
// as ./a.out
// See task statement or sample_grader.cpp for the input specification
//
typedef pair<int,int> ii;
typedef vector<ii> vii;
#define pf printf
#define pb push_back
#define sz(x) (int)x.size()
int getSize(vii &v){
int sum=0;
for(auto[a,b]:v)sum+=b-a+1;
return sum;
}
int inside(vii &v,int X,int up){
int half=(getSize(v)+up)/2;
for(int i=0;i<sz(v);++i){
if(half==0)break;
auto[l,r]=v[i];
if(r-l+1<=half){
if(l<=X&&X<=r)return 1;
half-=r-l+1;
}
else{
if(l<=X&&X<=l+half-1)return 1;
half=0;
}
}
return 0;
}
void split(vii &v,vii &vi,vii &ve,int up){
int half=(getSize(v)+up)/2;
for(int i=0;i<sz(v);++i){
auto[l,r]=v[i];
if(r-l+1<=half)vi.pb({l,r}),half-=r-l+1;
else if(half==0)ve.pb({l,r});
else vi.pb({l,l+half-1}),ve.pb({l+half,r}),half=0;
}
}
void encode(int N,int X){
vii corr,wrong;
corr.pb({1,N});
int num=0;
while(getSize(corr)+getSize(wrong)>3){
//pf("corr: ");for(auto[l,r]:corr)pf("(%d %d) ",l,r);pf("\n");
//pf("wrong: ");for(auto[l,r]:wrong)pf("(%d %d) ",l,r);pf("\n");
int res=send(inside(corr,X,1)||inside(wrong,X,0));
vector<ii> corrI,corrE,wrongI,wrongE;
split(corr,corrI,corrE,1);
split(wrong,wrongI,wrongE,0);
corr.clear();
wrong.clear();
if(res==1){
for(ii x:corrI)corr.pb(x);
for(ii x:wrongI)corr.pb(x);
for(ii x:corrE)wrong.pb(x);
}
else{
for(ii x:corrE)corr.pb(x);
for(ii x:wrongE)corr.pb(x);
for(ii x:corrI)wrong.pb(x);
}
}
vector<int> rem;
for(auto [l,r]:corr){
for(int i=l;i<=r;++i)rem.pb(i);
}
for(auto [l,r]:wrong){
for(int i=l;i<=r;++i)rem.pb(i);
}
//pf("rem: ");for(int i:rem)pf("%d ",i);pf("\n");
if(X==rem[0])send(0),send(0),send(0),send(0);
if(sz(rem)>=2&&X==rem[1])send(0),send(1),send(1),send(0);
if(sz(rem)>=3&&X==rem[2])send(1),send(1),send(1),send(1);
}
ii decode(int N){
vii corr,wrong;
corr.pb({1,N});
while(getSize(corr)+getSize(wrong)>3){
//pf("corr: ");for(auto[l,r]:corr)pf("(%d %d) ",l,r);pf("\n");
//pf("wrong: ");for(auto[l,r]:wrong)pf("(%d %d) ",l,r);pf("\n");
int res=receive();
vector<ii> corrI,corrE,wrongI,wrongE;
split(corr,corrI,corrE,1);
split(wrong,wrongI,wrongE,0);
corr.clear();
wrong.clear();
if(res==1){
for(ii x:corrI)corr.pb(x);
for(ii x:wrongI)corr.pb(x);
for(ii x:corrE)wrong.pb(x);
}
else{
for(ii x:corrE)corr.pb(x);
for(ii x:wrongE)corr.pb(x);
for(ii x:corrI)wrong.pb(x);
}
}
vector<int> rem;
for(auto [l,r]:corr){
for(int i=l;i<=r;++i)rem.pb(i);
}
for(auto [l,r]:wrong){
for(int i=l;i<=r;++i)rem.pb(i);
}
//pf("rem: ");for(int i:rem)pf("%d ",i);pf("\n");
int msk=0;
for(int i=0;i<4;++i){
int x=receive();
msk+=x<<i;
}
vector<int> msks={0,6,15},pos;
for(int i=0;i<3;++i){
int diff=msks[i]^msk;
if(__builtin_popcount(diff)<2||diff==5||diff==9||diff==10)pos.pb(rem[i]);
}
pos.pb(1);
return {pos[0],pos[1]};
}
Compilation message (stderr)
communication.cpp: In function 'void encode(int, int)':
communication.cpp:59:9: warning: unused variable 'num' [-Wunused-variable]
59 | int num=0;
| ^~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |