Submission #584064

#TimeUsernameProblemLanguageResultExecution timeMemory
584064AndrejSh3Parrots (IOI11_parrots)C++17
81 / 100
3 ms1084 KiB
#include<bits/stdc++.h> 
#include"encoder.h"
#include"encoderlib.h"
using namespace std;

/*
	Strategy:
	*) Encoder:
		Encoder will send the following number: xxxxxyyz
			xxxxx is the index of the number in the original message
			yy is which quarter of the message we're sending (33221100)
			z is true if the left bit of this quarter is 1, otherwise the right bit of this quarter is 1
		This encoder will send at most 8*N messages of length 8

	*) Decoder:
		Decoder will take the given numbers xxxxxyyz and create an array with the original message
*/

void sendValue( int i, int q, int Mi ){
	int rv = i;
	rv <<= 2;
	rv |= q;
	rv <<= 1;
	int _Mi = 0;
	if( q == 0 ) _Mi |= ( ( Mi & (1<<1) ) | ( Mi & (1<<0) ) ) >> 0;
	if( q == 1 ) _Mi |= ( ( Mi & (1<<3) ) | ( Mi & (1<<2) ) ) >> 2;
	if( q == 2 ) _Mi |= ( ( Mi & (1<<5) ) | ( Mi & (1<<4) ) ) >> 4;
	if( q == 3 ) _Mi |= ( ( Mi & (1<<7) ) | ( Mi & (1<<6) ) ) >> 6;
	if( _Mi & 1 ) send( rv | 0 );
	if( _Mi & 2 ) send( rv | 1 );
}

void encode( int N, int M[] ){

	for( int i = 0 ; i < N ; i++ ){
		for( int q = 0 ; q < 4 ; q++ ) sendValue( i, q, M[i] );
	}
	
}
#include<bits/stdc++.h>
#include"decoder.h"
#include"decoderlib.h"
using namespace std;

/*
	Strategy:
	*) Encoder:
		Encoder will send the following number: xxxxxyyz
			xxxxx is the index of the number in the original message
			yy is which quarter of the message we're sending (33221100)
			z is true if the left bit of this quarter is 1, otherwise the right bit of this quarter is 1
		This encoder will send at most 8*N messages of length 8

	*) Decoder:
		Decoder will take the given numbers xxxxxyyz and create an array with the original message
*/

void recieveValue( int Xi, int &x, int &y, int &z ){
	z = Xi & (0b1);
	Xi >>= 1;
	y = Xi & (0b11);
	Xi >>= 2;
	x = Xi;
}

void decode( int N, int L, int X[] ){

	int A[N]; for( int &i : A ) i = 0;

	int x, y, z;
	for( int i = 0 ; i < L ; i++ ){
		recieveValue( X[i], x, y, z );
		A[x] |= ( ( z ? 0b10 : 0b01 ) ) << (2*y);
	}

	for( int i = 0 ; i < N ; i++ ) output(A[i]);

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...