제출 #1163454

#제출 시각아이디문제언어결과실행 시간메모리
1163454sqrteipiData Transfer (IOI19_transfer)C++20
100 / 100
36 ms1848 KiB
#include <bits/stdc++.h>
#include "transfer.h"
using namespace std;

vector<int> get_attachment(vector<int> source) {
	int sum = 0, sum2 = 0;
	vector<int> attach;
	for (int i = 1; i <= source.size(); i++) {
		if (source[i - 1]) {
			sum ^= i;
		}
	}
	if (source.size() >= 100) for (int i = 0; i < 8; i++) attach.push_back((sum >> i) & 1), sum2 ^= attach.back();
	else for (int i = 0; i < 6; i++) attach.push_back((sum >> i) & 1), sum2 ^= attach.back();
	attach.push_back(sum2);
	return attach;
}

vector<int> retrieve(vector<int> data) {
	if (data.size() >= 100) {
		int n = data.size() - 9, sum = 0, sum2 = 0, sum3 = 0;
		for (int i = 1; i <= n; i++) {
			if (data[i - 1]) {
				sum ^= i;
			}
		}
		for (int i = n; i < n + 8; i++) {
			if (data[i]) {
				sum2 += 1 << (i - n);
				sum3 ^= 1;
			}
		}
		vector<int> source = data;
		for (int i = 0; i < 9; i++) source.pop_back();
		if (sum == sum2 || sum3 != data.back()) return source;
		else {
			int pos = sum ^ sum2;
			source[pos - 1] ^= 1;
			return source;
		}
	}
	else {
		int n = data.size() - 7, sum = 0, sum2 = 0, sum3 = 0;
		for (int i = 1; i <= n; i++) {
			if (data[i - 1]) {
				sum ^= i;
			}
		}
		for (int i = n; i < n + 6; i++) {
			if (data[i]) {
				sum2 += 1 << (i - n);
				sum3 ^= 1;
			}
		}
		vector<int> source = data;
		for (int i = 0; i < 7; i++) source.pop_back();
		if (sum == sum2 || sum3 != data.back()) return source;
		else {
			int pos = sum ^ sum2;
			source[pos - 1] ^= 1;
			return source;
		}
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...