Submission #759087

#TimeUsernameProblemLanguageResultExecution timeMemory
759087FidiskCave (IOI13_cave)C++14
100 / 100
541 ms760 KiB
#include <bits/stdc++.h>
#include "cave.h"
using namespace std;
 
#define edge(xxxx,yyyy) ((xxxx)*(m+5)+(yyyy))
#define oo 1e18
#define fi first
#define se second
#define sp(iiii) setprecision(iiii)
#define IO ios_base::sync_with_stdio(false); cin.tie(0)
#define ms(aaaa,xxxx) memset(aaaa,xxxx,sizeof(aaaa))
#define cntbit(xxxx) __builtin_popcount(xxxx)
#define getbit(xxxx,aaaa) (((xxxx)>>((aaaa)-1))&1)
#define totbit(xxxx) (32-__builtin_clz(xxxx))
#define totbitll(xxxx) (64-__builtin_clzll(ll(xxxx)))
 
typedef long double ld;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<pair<int,int>,int> piii;
typedef pair<long long,long long> pll;
typedef pair<pair<long long,long long>,long long> plll;
typedef pair<pair<long long,long long>,pair<long long,long long>> pllll;
typedef pair<pair<long long,long long>,bool> pllb;
 
const ll base=333333349;
const ll mod=1e9+7;
const ld eps=1e-5;
const ll maxn=50009;
 
vector<pii> correctPart,stablePart,questionPart,inversePart;
int ans1[5002],ans2[5002],queryVect[5002];
 
/*
int tryCombination(vector<int> ans) {
    for (int i=0;i<ans.size();i++) {
        cout<<ans[i]<<' ';
    }
    cout<<'\n';
    //cout<<"Query completed!\n";
    int kq;
    cin>>kq;
    return kq;
}
 
void answer(vector<int> x,vector<int> y) {
    for (int i=0;i<x.size();i++) {
        cout<<x[i]<<' ';
    }
    cout<<'\n';
    for (int i=0;i<y.size();i++) {
        cout<<y[i]<<' ';
    }
    cout<<'\n';
}
*/
 
int query() {
    //cout<<"We're here 2\n";
    //return 0;
    int k=correctPart.size();
    for (int i=0;i<k;i++) {
        queryVect[correctPart[i].fi]=correctPart[i].se;
    }
    k=stablePart.size();
    for (int i=0;i<k;i++) {
        queryVect[stablePart[i].fi]=stablePart[i].se;
    }
    k=questionPart.size();
    for (int i=0;i<k;i++) {
        queryVect[questionPart[i].fi]=questionPart[i].se;
    }
    k=inversePart.size();
    for (int i=0;i<k;i++) {
        queryVect[inversePart[i].fi]=inversePart[i].se^1;
    }
    k=tryCombination(queryVect);
    //cout<<k<<'\n';
    if (k<0) {
        return 5001;
    }
    return k;
}
 
void exploreCave(int n) {
    int m=n;
    correctPart.clear();
    stablePart.clear();
    questionPart.clear();
    inversePart.clear();
    for (int i=0;i<n;i++) {
        questionPart.push_back({i,0});
    }
    while (m>0) {
        int p=n-m;
        int k=questionPart.size();
        //cout<<"We're here\n";
        //return;
        //cout<<p<<"Reset\n";
        if (query()==p) {
            //cout<<"Flip!\n";
            for (int i=0;i<k;i++) {
                questionPart[i].se^=1;
            }
        }
        //for (int i=0;i<k;i++) {
        //    cout<<questionPart[i].fi<<"|"<<questionPart[i].se<<' ';
        //}
        //cout<<'\n';
        while (k>1) {
            for (int i=0;i<k/2;i++) {
                inversePart.push_back(questionPart.back());
                questionPart.pop_back();
            }
            if (query()==p) {
                k=questionPart.size();
                for (int i=0;i<k;i++) {
                    stablePart.push_back(questionPart.back());
                    questionPart.pop_back();
                }
                swap(questionPart,inversePart);
            }
            else {
                k=inversePart.size();
                for (int i=0;i<k;i++) {
                    stablePart.push_back(inversePart.back());
                    inversePart.pop_back();
                }
            }
            k=questionPart.size();
        }
        correctPart.push_back(questionPart.back());
        //cout<<correctPart.back().fi<<' '<<correctPart.back().se<<'\n';
        questionPart.clear();
        swap(questionPart,stablePart);
        m--;
    }
 
    for (int i=0;i<n;i++) {
        ans2[correctPart[i].fi]=i;
    }
    for (int i=0;i<n;i++) {
        ans1[correctPart[i].fi]=correctPart[i].se;
    }
 
    answer(ans1,ans2);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...