Submission #1361437

#TimeUsernameProblemLanguageResultExecution timeMemory
1361437coderg300711Message (IOI24_message)C++20
0 / 100
695 ms590236 KiB
#include "bits/stdc++.h"
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pii pair<int,int>
#define pll pair<long long,long long>
#define yes cout<<"Yes\n"
#define no cout<<"No\n"
#define pb push_back
#define sz(x) (int)(x).size()
#define rsz resize
#define ass assign
#define F(i,l,r) for(int i=(l);i<(r);++i)
typedef long long ll;
typedef unsigned long long ull;
typedef long double lld;
template<typename T> using pqg = priority_queue<T, vector<T>, greater<T>>;
#define each(a,x) for(auto a:x)
#define FOR(i,a) for(int i=0;i<(a);i++)
#define ROF(i,a,b) for(int i=(b)-1;i>=(a);i--)
#define eb emplace_back
#define ft front()
#define V vector

#include "message.h"

void send_message(V<bool> M,V<bool> C){
int s=sz(M);
V<int> safe;
int ptr=0;
while(ptr<31){
	V<bool> p(31,0);
	if(safe.empty()){
		FOR(i,31)p[i]=C[ptr];
		send_packet(p);
		if(!C[ptr])safe.pb(ptr);
	}else{
		int k=sz(safe),st=ptr;
		for(int i=0;i<k && ptr<31;++i)p[safe[i]]=C[ptr++];
		send_packet(p);
	    for(int i=0;i<k && st+i<31;++i){
	    	if(!C[st+i])safe.pb(st+i);
	    }
	}
}
V<bool> mprime(1025,0);
mprime[1025-s-1]=1;
FOR(i,s)mprime[1025-s+i]=M[i];
V<int> ids;//safe_ids
FOR(i,31){
	if(!C[i])ids.pb(i);
}
int ptr2=0;
FOR(i,65){
	V<bool> p(31,0);
	each(id,ids){
		if(ptr2<1025)p[id]=mprime[ptr2++];
	}
	send_packet(p);
}
}

V<bool> receive_message(V<V<bool>> R){
	V<bool> basma(31,0);
	V<int> safe;
	int ptr=0,ptr2=0;
	while(ptr<31){
		const V<bool>& tainted=R[ptr2++];
		if(safe.empty()){
			int ones=0;
			FOR(i,31){
				if(tainted[i])ones++;
			}
			bool v=(ones>=16);
			if(!v)safe.pb(ptr);
			ptr++;
		}else{
			int k=sz(safe),cur=ptr;
			for(int i=0;i<k && cur+i<31;++i){
				if(!basma[cur+i])safe.pb(cur+i);
			}
		}
	}
	V<int> ids;//safe_ids
	FOR(i,31){
		if(!basma[i])ids.pb(i);
	}
	V<bool> bits;
	while(ptr2<sz(R)){
		each(id,ids)bits.pb(R[ptr2][id]);
		ptr2++;
	}
	int first_one=-1;
	for(int i=0;i<1025 && i<sz(bits);++i){
		if(bits[i]){
			first_one=i;
			break;
		}
	}
	V<bool> M;
	if(!(~first_one)){
		for(int i=first_one;i<1025 && i<sz(bits);++i)M.pb(bits[i]);
	}
    return M;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...