#include "message.h"
#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2")
#define pb push_back
#define F first
#define pii pair<int,int>
#define all(a) a.begin(),a.end()
#define S second
#define sz(a) (int)a.size()
#define rep(i , a , b) for(int i = (a) ; i <= (b) ; i++)
#define per(i , a , b) for(int i = (a) ; i >= (b) ; i--)
#define ld double
#define ll long long
using namespace std ;
const int maxn = 500 + 100 , inf = 1e9 , mod = 998244353;
int mark[maxn] , c[maxn ];
int p[] = {7,11,1,4,23,25,22,24,8,2,9,13,21,10,19,3,15,14,16,30,6,17,18,0,27,20,5,29,12,26,28} ;
int ch(){
int t0 = 16 , t1 = 15 ;
rep(i , 0 ,30){
if(mark[i] == 1){
if(c[i] == 0)t0-- ;
if(c[i] == 1)t1--;
}
}
if(t0 > t1)return 1 ;
return 0 ;
}
int cp[maxn] ;
void send_message(std::vector<bool> M, std::vector<bool> C) {
rep(i , 0 ,30)cp[i]=C[i];
rep(i , 0 ,30)c[i] =C[i] ;
rep(i , 0 ,30)mark[i] = 0;
int ted= 0 , f =0 ;
vector <int> az ;
while(ted != 31){
vector <bool> a ;vector <int> az2 , az3;
rep(i , 0 ,30)a.pb(0) ;
int s = sz(az) , id =0 ;
while(ted!=31 && id!=s){
a[az[id]] = C[p[ted]] ;
if(C[p[ted]]==0)az2.pb(p[ted]) ;
else az3.pb(p[ted]);
id++;
ted++ ;
}
if(ch() && ted != 31){
rep(i , 0 ,30){
if(mark[i] == 0){
a[i] = C[p[ted]];
}
}
if(C[p[ted]] == 0)az2.pb(p[ted]) ;
else az3.pb(p[ted]) ;
ted++ ;
}
send_packet(a) ;
f++ ;
for(int x : az2){az.pb(x) ;mark[x] = 1;}
for(int x : az3){mark[x] =1 ;}
}
vector <bool> sz ;
int bit =0 ;
rep(i , 0 ,30){
if(C[i]==1){
sz.pb(0);
continue;
}
sz.pb(sz(M)>>bit&1);
bit++ ;
}
send_packet(sz);
vector <bool> o ;
rep(i , 0 ,sz(M)-1){
o.pb(M[i]) ;
if(i==sz(M)-1 || sz(o) ==16){
vector <bool> vec ;
int id = 0 ;
rep(i , 0 ,30){
if(C[i] == 1){
vec.pb(0) ;
}else{
vec.pb(o[id]) ;
id++;
}
}
send_packet(vec) ;
}
}
}
std::vector<bool> receive_message(std::vector<std::vector<bool>> R) {
vector <int> c;
rep(i , 0 ,30)c.pb(1);
rep(i , 0 ,31)mark[i] =0 ;
int ted= 0 , f =0 ;
vector <int> az ;int cnt =0 ;
while(ted != 31){
// cout << "st---\n" ;
vector <bool> a = R[cnt] ;vector <int> az2 , az3 ;cnt++ ;
int s = sz(az) , id =0 ;
while(ted!=31 && id!=s){
c[p[ted]] = a[az[id]] ;
if(c[p[ted]]==0)az2.pb(p[ted]) ;
else az3.pb(p[ted]) ;
// cout << p[ted] << " : " << cp[p[ted]] << " " << c[p[ted]] << "<--\n" ;
id++;
ted++ ;
}
if(ch() && ted != 31){
int sm =0 ;
rep(i , 0 ,30){
if(mark[i] == 1)continue ;
if(a[i] == 1)sm++;
else sm-- ;
}
if(sm > 0){
c[p[ted]] = 1;
}else{
c[p[ted]] = 0 ;
}
/// cout << p[ted] << " : " << cp[p[ted]] << " " << c[p[ted]] << "<--\n" ;
if(c[p[ted]] == 0)az2.pb(p[ted]) ;
else az3.pb(p[ted]);
ted++ ;
}
f++ ;
for(int x : az2){mark[x] = 1; az.pb(x) ;}
for(int x : az3)mark[x] = 1;
// cout <<sz(az) << "<-----------------------\n";
// cout << "en" ;
}
// cout << "\n" ;
// rep(i , 0 ,30)cout << c[i] ;
//cout << '\n' ;
vector <bool> sz = R[cnt];cnt++;
int rs =0 ,bit= 0;
rep(i , 0, 30){
if(c[i] == 1)continue ;
rs += (1<<bit) * sz[i] ;
bit++ ;
}
int u = 0;
vector <bool> m ;
while(sz(m) != rs){
vector <bool> a = R[cnt] ;cnt++ ;
rep(i , 0 ,30){
if(sz(m)==rs)continue ;
if(c[i] == 1)continue ;
m.pb(a[i]) ;
}
}
return m ;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |