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;
#define forn(i,n) for (int i=0; i<n; ++i)
vector<int> V;
void brut(int x, int n, int v=0, int i=0, int l=0) {
if (i>=n) {V.push_back(v); return;}
int b=(x>>i)&1;
brut(x,n,v+(b<<i),i+1,0);
if (l==0) brut(x,n,v+((!b)<<i),i+1,1);
}
vector<int> get_possible(int n) {
int x=0, q=0;
forn(i,29) {
q=receive();
x+=q<<i;
}
brut(x,29,0,0,0);
vector<int> b;
set<int> s;
for (auto x:V) {
if (x>=n) continue;
for (int i=0; i+x<n; i+=1<<29) {
s.insert(x);
}
}
for (auto x:s) b.push_back(x);
V.clear();
return b;
}
vector<int> dequery(vector<int>&a,int bit) {
int x=0, q;
forn(i,bit) x+=receive()<<i;
brut(x,bit);
vector<int> b;
set<int> s;
for (auto x:V) {
if (x>=a.size()) continue;
for (int i=0; i+x<a.size(); i+=(1<<bit)) {
s.insert(a[i+x]);
}
}
for (auto x:s) b.push_back(x);
V.clear();
return b;
}
pair<int,int> decode(int n) {
vector<int> a=get_possible(n); //for (auto x:a) cout<<x<<' '; cout<<'\n';
a=dequery(a,21);
a=dequery(a,15);
a=dequery(a,11);
a=dequery(a,8);
a=dequery(a,6);
a=dequery(a,4);
a=dequery(a,3);
a=dequery(a,4); //for (auto x:a) cout<<x<<' '; cout<<'\n';
a=dequery(a,3); //for (auto x:a) cout<<x<<' '; cout<<'\n';
a=dequery(a,2); //for (auto x:a) cout<<x<<' '; cout<<'\n';
a=dequery(a,2); //for (auto x:a) cout<<x<<' '; cout<<'\n';
if (a.size()==1) return{a[0]+1,a[0]+1};
if (a.size()==2) return{a[0]+1,a[1]+1};
assert(a.size()==3);
int q,x=0;
q=receive();
x+=q<<0;
q=receive();
x+=q<<1;
q=receive();
x+=q<<2;
q=receive();
x+=q<<3;
vector<int> ans;
vector<int> A={0,1,5,10,9,8,2,4};
vector<int> B={1,8,9,11,13,3,12,0};
vector<int> C={6,15,2,4,12,3,7,14};
for (auto v:A) if (v==x) ans.push_back(a[0]);
for (auto v:B) if (v==x) ans.push_back(a[2]);
for (auto v:C) if (v==x) ans.push_back(a[1]);
if (ans.size()==1) return {ans[0]+1,ans[0]+1};
return {ans[0]+1,ans[1]+1};
}
int Send(int x, int bit) {
int ret=0;
forn(i,bit) ret+=send((x>>i)&1)<<i;
return ret;
}
vector<int> get_possible(int n, int x) {
x=Send(x,29);
brut(x,29);
vector<int> b;
set<int> s;
for (auto x:V) {
if (x>=n) continue;
for (int i=0; i+x<n; i+=1<<29) {
s.insert(x);
}
}
for (auto x:s) b.push_back(x);
V.clear();
return b;
}
vector<int> query(vector<int>&a,int x,int bit) {
int l=0,r=a.size()-1;
while (l<r) {
int mid=(l+r+1)>>1;
if (a[mid]>x) r=mid-1;
else l=mid;
}
r=Send(r,bit);
brut(r,bit);
vector<int> b;
set<int> s;
for (auto x:V) {
if (x>=a.size()) continue;
for (int i=0; i+x<a.size(); i+=(1<<bit)) {
s.insert(a[i+x]);
}
}
for (auto x:s) b.push_back(x);
V.clear();
return b;
}
void encode(int n, int x) {
--x;
vector<int> a=get_possible(n,x); //for (auto x:a) cout<<x<<' '; cout<<'\n';
a=query(a,x,21);
a=query(a,x,15);
a=query(a,x,11);
a=query(a,x,8);
a=query(a,x,6);
a=query(a,x,4);
a=query(a,x,3);
a=query(a,x,4); //for (auto x:a) cout<<x<<' '; cout<<'\n';
a=query(a,x,3); //for (auto x:a) cout<<x<<' '; cout<<'\n';
a=query(a,x,2); //for (auto x:a) cout<<x<<' '; cout<<'\n';
a=query(a,x,2); //for (auto x:a) cout<<x<<' '; cout<<'\n';
if (a.size()<3) return;
assert(a.size()==3);
int v=0,b=0;;
if (x==a[0]) {
b=send(0);
v+=b<<0;
b=send(0);
v+=b<<1;
b=send(0);
v+=b<<2;
b=send(0);
v+=b<<3;
} else if (x==a[1]) {
b=send(0);
v+=b<<0;
b=send(1);
v+=b<<1;
b=send(1);
v+=b<<2;
b=send(0);
v+=b<<3;
} else {
b=send(1);
v+=b<<0;
b=send(0);
v+=b<<1;
b=send(0);
v+=b<<2;
b=send(1);
v+=b<<3;
}
}
Compilation message (stderr)
communication.cpp: In function 'std::vector<int> dequery(std::vector<int>&, int)':
communication.cpp:42:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
42 | if (x>=a.size()) continue;
| ~^~~~~~~~~~
communication.cpp:43:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
43 | for (int i=0; i+x<a.size(); i+=(1<<bit)) {
| ~~~^~~~~~~~~
communication.cpp:35:14: warning: unused variable 'q' [-Wunused-variable]
35 | int x=0, q;
| ^
communication.cpp: In function 'std::vector<int> query(std::vector<int>&, int, int)':
communication.cpp:130:8: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
130 | if (x>=a.size()) continue;
| ~^~~~~~~~~~
communication.cpp:131:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
131 | for (int i=0; i+x<a.size(); i+=(1<<bit)) {
| ~~~^~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |