Submission #382419

#TimeUsernameProblemLanguageResultExecution timeMemory
382419BartolMXoractive (IZhO19_xoractive)C++17
88 / 100
6 ms640 KiB
#include <bits/stdc++.h>
#include "interactive.h"

using namespace std;

#define X first
#define Y second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef pair <int, int> pii;
typedef pair <int, pii> pip;
typedef pair <pii, int> ppi;
typedef pair <ll, ll> pll;

const int INF=0x3f3f3f3f;
const int OFF=128;
const int N=105;

int n, off=1;
int jed;
int lo[2*OFF], hi[2*OFF];
set <int> br[2*OFF];
vector <int> sol;

void rek(int pos, int a, int b) {
    lo[pos]=a; hi[pos]=b;
    if (pos<off) {
        rek(pos*2, a, (a+b)/2);
        rek(pos*2+1, (a+b)/2, b);
    }
}

set <int> pitaj(vector <int> v) {
    set <int> ret;

//    printf("pitam za: ");
//    for (int x:v) printf("%d ", x);
//    printf("\n");

    if (v.empty()) return ret;
    vector <int> izbaci=get_pairwise_xor(v);
    v.pb(1);
    vector <int> svi=get_pairwise_xor(v);

//    printf("izbaci: ");
//    for (int x:izbaci) printf("%d ", x);
//    printf("\nsvi: ");
//    for (int x:svi) printf("%d ", x);
//    printf("\n");

    svi.erase(svi.begin());

    int i=0;
    for (int x:izbaci) {
        while (svi[i]<x) ret.insert(svi[i++]);
        i++;
    }
    while (i<svi.size()) ret.insert(svi[i++]);

//    for (int x:ret) printf("%d ", x);
//    printf("\n");

    return ret;
}

vector<int> guess(int nn) {
    n=nn;
    jed=ask(1);

	while (off<(n+1)) off*=2;

	rek(1, 0, off);

	vector <int> v;
	for (int i=2; i<=n; ++i) v.pb(i);
	br[1]=pitaj(v);

	for (int i=1; (1<<i)<=off; ++i) {
	    v.clear();
	    for (int node=(1<<i); node<(1<<(i+1)); node+=2) {
	        for (int j=lo[node]; j<hi[node]; ++j) if (j>1 && j<=n) v.pb(j);
	    }
	    set <int> MS=pitaj(v);
	    for (int lef=(1<<i); lef<(1<<(i+1)); lef+=2) {
            int par=lef/2, rig=lef+1;
            for (int x:br[par]) {
                if (MS.count(x)) br[lef].insert(x);
                else br[rig].insert(x);
            }
	    }
	}
	sol.pb(jed);
    #if DEBUG
        printf("%d ", jed);
    #endif // DEBUG
	for (int i=2; i<=n; ++i) {
        assert((int)br[i+off].size()==1);
        int x=*br[i+off].begin();
        sol.pb(jed^x);
//        printf("%d ", jed^x);
	}
//	printf("\n")
	return sol;
}

Compilation message (stderr)

Xoractive.cpp: In function 'std::set<int> pitaj(std::vector<int>)':
Xoractive.cpp:59:13: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   59 |     while (i<svi.size()) ret.insert(svi[i++]);
      |            ~^~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...