Submission #1206581

#TimeUsernameProblemLanguageResultExecution timeMemory
1206581vidux메시지 (IOI24_message)C++17
0 / 100
78 ms840 KiB
#include <bits/stdc++.h>
using namespace std;

//#define LOCAL

#ifndef LOCAL
#include "message.h"
#endif

#define FOR(i, n) for (int i = 0; i < n; ++i)
#define REP(i, n, m) for (int i = n; i <= m; ++i)
#define REPR(i, n, m) for (int i = n; i >= m; --i)
#define FORR(x, a) for (auto& x : a)
#define FORR2(x, y, a) for (auto& [x, y] : a)
#define ALL(x) (x).begin(), (x).end()
#define RALL(x) (x).rbegin(), (x).rend()
#define SZ(a) ((int)a.size())

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<bool> vb;
typedef vector<vi> vvi;
typedef vector<vl> vvl;
typedef vector<vb> vvb;

const int INF = 1e9;
const ll LLINF = 1e18;
const int N = 31;

#ifdef LOCAL
vb LOCAL_C;
vvb R;
std::vector<bool> send_packet(std::vector<bool> A) {
	vb ret(N);
	FOR(i, N) 
		if (LOCAL_C[i]) ret[i] = rand() % 2;
		else ret[i] = A[i];
	cout << "sending: "; FOR(i, N) cout << ret[i] << " "; cout << endl;
	R.push_back(ret);
	//if (SZ(R) == 31) cout << endl;
	return ret;
}
#endif

void send_message(std::vector<bool> M, std::vector<bool> C) {
	int sent = 0;
#ifdef LOCAL
	LOCAL_C = C;
#endif
	int dist[2] = {0};
	int cnt[2] = {0};
	while (cnt[0] < 2) {
		cnt[0] += C[dist[0]] == 0;
		dist[0]++;
	}
	while (cnt[1] < 2) {
		cnt[1] += C[N-1-dist[1]] == 0;
		dist[1]++;
	}
	//cout << dist[0] << " " << dist[1] << endl;
	send_packet(vector<bool>(N, dist[0]>dist[1]));
	vi allSafe;
	FOR(i, N) if (C[i] == 0) allSafe.push_back(i);
	vi curSafe;
	bool f = dist[0] < dist[1];
	int mIdx = f ? 0 : N-1;
	while (SZ(curSafe) < 16) {
		if (SZ(curSafe) < 2) {
			//cout << ">1<" << endl;
			bool c = C[mIdx];
			if (c == 0) curSafe.push_back(mIdx);
			send_packet(vector<bool>(N, c));
			if (f) mIdx++;
			else mIdx--;
		}
		else {
			//cout << ">2<" << endl;
			vector<bool> m(N);
			vi newSafe;
			FORR(sIdx, curSafe) {
				if ((mIdx == N && f) || (mIdx == -1 && !f)) break;
				bool c = C[mIdx];
				if (c == 0) newSafe.push_back(mIdx);
				m[sIdx] = c;
				if (f) mIdx++;
				else mIdx--;
			}
			send_packet(m);
			FORR(x, newSafe) curSafe.push_back(x);
		}
	}
	vector<bool> m(N);
	reverse(ALL(curSafe));
	FOR(i, 16) {
		m[curSafe[i]] = (SZ(M) & (1 << i)) > 0;
	}
	send_packet(m);
	int idx = 0;
	FOR(i, SZ(M)) {
		m[curSafe[idx%16]] = M[i];
		idx++;
		if (idx%16 == 0) send_packet(m);
	}
	if (idx%16 != 0) send_packet(m);
}

std::vector<bool> receive_message(std::vector<std::vector<bool>> R) {
	auto getAvg = [](vector<bool> m) -> bool {
		int cnt = 0;
		FOR(i, N) cnt += m[i];
		return cnt >= 16;
	};
	bool f = getAvg(R[0]);
	vi safe;
	int idx = 1;
	vector<bool> C;
	while (SZ(safe) < 16) {
		if (f) reverse(ALL(R[idx]));
		if (SZ(safe) < 2) {
			bool c =  getAvg(R[idx]);
			if (c == 0) safe.push_back(SZ(C));
			C.push_back(c);
		}
		else {
			vi newSafe;
			FORR(s, safe) {
				if (SZ(C) == N) break;
				bool c = R[idx][s];
				if (c == 0) newSafe.push_back(SZ(C));
				C.push_back(c);
			}
			FORR(x, newSafe) safe.push_back(x);
		}
		//cout << idx << ":   "; FORR(s, safe) cout << s << " "; cout << endl;
		idx++;
	}
	C = vector<bool>(31, 1);
	FORR(s, safe) {
		if (f) s = N-1-s;
		C[s] = 0;
	}
	if (f) reverse(ALL(safe));
	//cout << "s: "; FOR(x, 16) cout << safe[x] << " "; cout << endl;
	//cout << "c: "; FOR(x, N) cout << C[x] << " "; cout << endl;

	auto read = [&](vector<bool> &m) -> vector<bool> {
		vector<bool> v;
		FOR(i, N) if (C[i] == 0) v.push_back(m[i]);
		if (!f) reverse(ALL(v));
		return v;
	};

	vector<bool> sz = read(R[idx++]);
	int n = 0;
	FOR(i, 16) n |= (1 << i) * sz[i];
	//cout << "sz: " << n << endl;
	vector<bool> ans;
	while (SZ(ans) < n) {
		//cout << "r: "; FOR(i, N) cout << R[idx][i] << " "; cout << endl;
		vector<bool> m = read(R[idx++]);
		//cout << "m: "; FOR(i, 16) cout << m[i] << " "; cout << endl;
		FOR(i, 16) {
			if (SZ(ans) == n) break;
			ans.push_back(m[i]);
		}
	}
	return ans;
}

#ifdef LOCAL
int main() {
	int t; cin >> t;
	while (t--) {
		R.clear();
		int n; cin >> n;
		vb a(n);
		FOR(i, n) { int x; cin >> x; a[i] = x; }
		vb c(N);
		FOR(i, N) { int x; cin >> x; c[i] = x; }
		send_message(a, c);
		vb ans = receive_message(R);
		FOR(i, SZ(ans)) cout << ans[i] << " "; cout << endl;
	}
	return 0;
}
#endif
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...