Submission #503072

#TimeUsernameProblemLanguageResultExecution timeMemory
503072MazaalaiXoractive (IZhO19_xoractive)C++17
100 / 100
6 ms344 KiB
#include "interactive.h"
#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define ff first
#define ss second
#define LINE "------------------\n"
#define ALL(x) x.begin(),x.end()
#define print(x) for(auto&el:x)cout<<el<<' ';cout<<'\n';
using namespace std;
using VI = vector <int>;
const int N = 105;
vector <int> ans;
int a1, n, answered;
// get_pairwise_xor, ask
void assign(int pos, int val) {
	answered++;
	ans[pos]=val;
}
VI dif(VI&a, VI&b) {
	VI c;
	int i = 0, j = 0, x = a.size(), y = b.size();
	while(i < x) {
		if (j < y && a[i] == b[j]) {
			i++, j++;
			continue;
		}
		c.pb(a[i++]);
	}
	// cout << "a: ";print(a);
	// cout << "b: ";print(b);
	// cout << "c: ";print(c);
	return c;
}
VI getVals(VI ids) {
	VI ids1 = ids, ret;
	ids.pb(1);
	VI res = get_pairwise_xor(ids);
	VI res1 = get_pairwise_xor(ids1);
	// cout << "res:";print(res);
	// cout << "res1:";print(res1);
	VI vals = dif(res, res1);
	for (int i = 1; i < vals.size(); i+=2) ret.pb(vals[i]^a1);
	// cout << "ids:";print(ids);
	// cout << "ret:";print(ret);
	return ret;
}
VI Union(VI&a, VI&b) {
	set <int> vals(ALL(a));
	for (auto& el : b) vals.insert(el);
	return VI(ALL(vals));
}
VI intersect(VI a, VI b) {
	set <int> vals(ALL(a)), res;
	for (auto& el : b) 
		if (vals.count(el)) res.insert(el);
	return VI(ALL(res));
}
vector<int> guess(int _n) {
	n = _n;
	a1 = ask(1); 
	ans.resize(n);
	assign(0, a1); // 0
	VI ids[10], vals[10];
	for (int i = 2; i <= n; i++) 
	for (int j = 0; (1<<j) <= i; j++) 
		if (i&(1<<j)) ids[j].pb(i);
	// for (int i = 0; i < 10; i++) cout << ids[i].size() << '\n';
	for (int i = 0; !ids[i].empty(); i++) 
		vals[i] = getVals(ids[i]);
	
	VI allVals;
	for (int j = 0; j < 10; j++) sort(ALL(vals[j]));
	for (int i = 0; i < 10; i++)
		allVals = Union(allVals, vals[i]);

	// for (int j = 0; (1<<j) <= n; j++) {
		// cout << j << ": ";
		// print(vals[j]);
	// }
	for (int i = 2; i <= n; i++) {
		VI cur = allVals;
		// cout << LINE;
		// cout << "val: " << i << "\n";
		for (int j = 0; (1<<j) <= n; j++) {
			// cout << j << ": ";
			VI tmp;
			if (i&(1<<j)) {
				// cout << 1 << " ";
				tmp = vals[j];
			} else {
				// cout << 0 << " ";
				tmp = dif(allVals, vals[j]);
			}
			// print(tmp);
			cur = intersect(cur, tmp);
		}
		if (cur.size() != 1) { // error
			ans[0] = -1;
			return ans;
		}
		assign(i-1, cur[0]);
	}
	return ans;
}
























Compilation message (stderr)

Xoractive.cpp: In function 'VI getVals(VI)':
Xoractive.cpp:43:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   43 |  for (int i = 1; i < vals.size(); i+=2) ret.pb(vals[i]^a1);
      |                  ~~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...