Submission #384382

# Submission time Handle Problem Language Result Execution time Memory
384382 2021-04-01T14:23:44 Z patrikpavic2 Xoractive (IZhO19_xoractive) C++17
6 / 100
6 ms 492 KB
#include "interactive.h"
#include <vector>
#include <cstdio>
#include <algorithm>

#define PB push_back

using namespace std;

typedef vector < int > vi;

vi razlika(vi &A, vi &B){
	int i = 0, j = 0;
	vi ret;
	for(;i < (int)A.size() || j < (int)B.size();){
		if(i == (int)A.size() || (j < (int)B.size() && B[j] < A[i])) 
			ret.PB(B[j++]);
		else if(j == (int)B.size() || (i < (int)A.size() && B[j] > A[i])) 
			ret.PB(A[i++]);
		else
			i++, j++;
	}
	return ret;
}

vi presjek(vi &A, vi &B){
	int i = 0, j = 0;
	vi ret;
	for(;i < (int)A.size() && j < (int)B.size();){
		if(B[j] < A[i]) 
			j++;
		else if(B[j] > A[i]) 
			i++;
		else
			ret.PB(A[i++]), j++;
	}
	return ret;
}

int jen;

vi saznaj(vi pos){
	if((int)pos.size() == 0) return {};
	vi A, B, C, ret;
	A = get_pairwise_xor(pos);
	pos.PB(1);
	B = get_pairwise_xor(pos);
	C = razlika(A, B); 
	for(int i = 1;i < (int)C.size();i += 2)
		ret.PB(C[i] ^ jen);
	sort(ret.begin(), ret.end());
	return ret;
}

vi B[2][10], svi;

const int BIT = 6;
const double KOF = 1.8;
const int N = 105;

int msk[N];

void generate(int l, int r, int raz){
	if(raz == BIT) return;
	if(r <= l) return;
	int mid = (int)((double)(l + r) / KOF);
	mid = min(max(mid, l), r - 1);
	for(int i = l;i <= mid;i++) {
	//	printf("%d u %d\n", i, raz);
		msk[i] += (1 << raz);
	}
	generate(l, mid, raz + 1);
	generate(mid + 1, r, raz + 1);
}

vi guess(int n) {
//	printf("TU SAM\n");
	vi ans; jen = ask(1);
	for(int i = 2;i <= n;i++)
		svi.PB(i);
	svi = saznaj(svi);
	generate(2, n, 0);
	for(int i = 0;i < BIT;i++){
		vi Q;
		for(int j = 2;j <= n;j++){
			if(msk[j] & (1 << i))
				Q.PB(j);
		}
		B[1][i] = saznaj(Q);
		B[0][i] = razlika(svi, B[1][i]);
	}	
//	printf("TU SAM n = %d\n", n);
	for(int i = n;i >= 2;i--){
		vi cur = svi;
		for(int j = 0;j < BIT;j++){
		//	printf("pozivam presjek\n"); 
			cur = presjek(cur, B[!!(msk[i] & (1 << j))][j]);
		//	printf("gotov presjek\n");
		}
		//printf("i = %d cur = %d\n", i, (int)cur.size());
		int ja = cur[0];
		ans.PB(ja);
		vi pos; pos.PB(ja);
		//printf("A[ %d ] = %d\n", i, ja); 
		for(int j = 0;j < BIT;j++){
			B[!!(msk[i] & (1 << j))][j] = razlika(B[!!(msk[i] & (1 << j))][j], pos);
		}
	}
	ans.PB(jen); 
	reverse(ans.begin(), ans.end());
	return ans;
}
# Verdict Execution time Memory Grader output
1 Correct 1 ms 256 KB Output is correct
2 Correct 1 ms 256 KB Output is correct
3 Correct 1 ms 256 KB Output is correct
4 Correct 1 ms 256 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 6 ms 492 KB Output is not correct
2 Halted 0 ms 0 KB -