Submission #1176480

#TimeUsernameProblemLanguageResultExecution timeMemory
1176480Zero_OPData Transfer (IOI19_transfer)C++20
0 / 100
5 ms1728 KiB
#include "transfer.h"
#include <bits/stdc++.h>

using namespace std;

std::vector<int> get_attachment(std::vector<int> source) {
	int N = (int)source.size();
	vector<int> send = source;

	int b = 0;
	while((1 << b) <= N) ++b;
	vector<int> parity(b);

	for(int i = 0; i < N; ++i) if(source[i] == 0){
		for(int j = 0; j < b; ++j) if((i+1) >> j & 1) parity[j] ^= 1;
	}

	return parity;
}

std::vector<int> retrieve(std::vector<int> data) {
	int L = (int)data.size();
	//L = N + 32 - __builtin_clz(N)

	int N = -1, b = -1;
	for(int i = 1; i < L; ++i){
		int nbit = 0;
		while((1 << nbit) <= i) ++nbit;
		if(i + nbit == L){
			N = i;
			b = nbit;
			break;
		}
	}

	assert(N != -1);

	vector<int> cur(b), fix(data.begin() + N, data.end());
	vector<int> receive(data.begin(), data.begin() + N);
	for(int i = 0; i < N; ++i) if(data[i] == 0){
		for(int j = 0; j < b; ++j) if((i+1) >> j & 1) cur[j] ^= 1;
	}

	assert((int)cur.size() == (int)fix.size());

	int changed = 0;
	for(int i = 0; i < b; ++i){
		if(cur[i] != fix[i]) changed |= (1 << i);
	}

	if(changed != 0){
		receive[changed-1] ^= 1;
	}
	return receive;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...