#include"communication.h"
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define ll long long
#define ld long double
#define ull unsigned long long
#define ff first
#define ss second
#define pii pair<int,int>
#define pll pair<long long, long long>
#define vi vector<int>
#define vl vector<long long>
#define pb push_back
#define rep(i, b) for(int i = 0; i < (b); ++i)
#define rep2(i,a,b) for(int i = a; i <= (b); ++i)
#define rep3(i,a,b,c) for(int i = a; i <= (b); i+=c)
#define count_bits(x) __builtin_popcountll((x))
#define all(x) (x).begin(),(x).end()
#define siz(x) (int)(x).size()
#define forall(it,x) for(auto& it:(x))
using namespace __gnu_pbds;
using namespace std;
typedef tree<int, null_type, less<int>, rb_tree_tag,tree_order_statistics_node_update> ordered_set;
//mt19937 mt;void random_start(){mt.seed(chrono::time_point_cast<chrono::milliseconds>(chrono::high_resolution_clock::now()).time_since_epoch().count());}
//ll los(ll a, ll b) {return a + (mt() % (b-a+1));}
const int INF = 1e9+50;
const ll INF_L = 1e18+40;
const ll MOD = 1e9+7;
const int BIT = 30;
void encode(int N, int X)
{
vector<int> bits;
rep(i,BIT)
{
if(X & (1 << i)) bits.pb(1);
else bits.pb(0);
}
int prev = 0;
rep2(i,1,BIT-1)
{
int v0 = send(bits[prev]);
int v1 = send(bits[i]);
int v2 = send(bits[i]);
int v3 = send(bits[prev]);
if(v1 == v2)
{
continue;
}
else
{
prev = i;
}
}
}
pair<int,pii> prev_bit[BIT];
pii decode(int N)
{
int prev = 0;
prev_bit[0] = {-1,{-1,-1}};
vi bits(BIT,-1);
rep2(i,1,BIT-1)
{
int v0 = receive();
int v1 = receive();
int v2 = receive();
int v3 = receive();
if(v1 == v2)
{
bits[i] = v1;
continue;
}
else
{
if(v0 == v3)
{
bits[prev] = v0;
int cur = prev;
int cur_s = v0;
while(prev_bit[cur].ff != -1)
{
if(prev_bit[cur].ss.ff == cur_s)
{
cur_s = prev_bit[cur].ss.ss ^ 1;
}
else
{
cur_s = prev_bit[cur].ss.ss;
}
bits[prev_bit[cur].ff] = cur_s;
cur = prev_bit[cur].ff;
}
prev = i;
prev_bit[i] = {-1,{-1,-1}};
}
else
{
prev_bit[i] = {prev,{v3,v2}};
prev = i;
}
}
}
int ans = 0;
rep(bit,BIT)
{
if(bits[bit] != -1) ans += bits[bit] * (1 << bit);
}
int rand_cost = 0;
int total_rand_cost = (1 << prev);
int cur = prev;
int cur_s = 0;
while(prev_bit[cur].ff != -1)
{
if(prev_bit[cur].ss.ff == cur_s)
{
cur_s = prev_bit[cur].ss.ss ^ 1;
}
else
{
cur_s = prev_bit[cur].ss.ss;
}
total_rand_cost += (1 << prev_bit[cur].ff);
rand_cost += (1 << prev_bit[cur].ff) * cur_s;
bits[prev_bit[cur].ff] = cur_s;
cur = prev_bit[cur].ff;
}
return {ans + rand_cost, ans + (rand_cost ^ total_rand_cost)};
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |