제출 #1328546

#제출 시각아이디문제언어결과실행 시간메모리
1328546MateiKing80메시지 (IOI24_message)C++20
10 / 100
384 ms828 KiB
#include <bits/stdc++.h>
#include "message.h"

using namespace std;

// std::vector<bool> send_packet(std::vector<bool> A)

//de aplicat o permuatre random sau ceva la inceput
//ar trebui sa micsoreze numarul de mesaje trimise cu gen 10

void send_message(vector<bool> M, vector<bool> C) {
	vector<vector<bool>> trim(66, vector<bool>(31));
	vector<int> bune;
	for (int i = 0; i < 31; i ++) {
		if (!C[i]) {
			bune.push_back(i);
		}
	}
	int mx = 0;
	bune.push_back(bune[0] + 31);
	for (int i = 0; i < 16; i ++) {
		trim[bune[i + 1] - bune[i] - 1][bune[i]] = 1;
		mx = max(mx, bune[i + 1] - bune[i]);
	}
	vector<int> nxt(31, 0);
	for (int i = 0; i < (int)bune.size() - 1; i ++) {
		nxt[bune[i]] = bune[i + 1];
	}
	int pm = 0;
	for (int i = 0; i < 65; i ++) {
		for (int j = 0; j < 31; j ++) {
			if (!C[j] && nxt[j] - j <= i) {
				if (pm < (int)M.size()) {
					trim[i][j] = M[pm];
				} else if (pm == (int)M.size()) {
					trim[i][j] = 1;
				} else {
					trim[i][j] = 0;
				}
				pm ++;
			}
		}
	}  
	for (auto i : trim) {
		send_packet(i);
	}
}

vector<bool> receive_message(vector<vector<bool>> R) {
	vector<int> nxt(31, 0);
	for (int i = 0; i < 31; i ++) {
		for (int j = 0; j < 20; j ++) {
			if (R[j][i] == 1) {
				nxt[i] = (i + j + 1) % 31;
				break;
			}
		}
	}
	vector<int> bune;
	for (int i = 0; i < 31; i ++) {
		vector<int> v;
		vector<bool> viz(31, 0);
		int loc = nxt[i];
		v.push_back(i);
		viz[i] = 1;
		while (!viz[loc]) {
			v.push_back(loc);
			viz[loc] = 1;
			loc = nxt[loc];
		}
		if (v.size() == 16) {
			bune = v;
			break;
		}
	}
	sort(bune.begin(), bune.end());
	vector<int> C(31, 1);
	for (auto i : bune) {
		C[i] = 0;
	}
	bune.push_back(bune[0] + 31);
	nxt.assign(31, 0);
	for (int i = 0; i < (int)bune.size() - 1; i ++) {
		nxt[bune[i]] = bune[i + 1];
	}
	vector<bool> ans;
	bool ok = false;
	for (int i = 65; i >= 0; i --) {
		for (int j = 30; j >= 0; j --) {
			if (!C[j] && nxt[j] - j <= i) {
				if (!ok && R[i][j] == 1) {
					ok = true;
				} else if (ok) {
					ans.push_back(R[i][j]);
				}
			}
		}
	}
	reverse(ans.begin(), ans.end());
	return ans;
}




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