Submission #847480

#TimeUsernameProblemLanguageResultExecution timeMemory
847480oscar1fMonster Game (JOI21_monster)C++17
92 / 100
73 ms4648 KiB
#include<bits/stdc++.h>
#include "monster.h"

using namespace std;

const int MAX_VAL=1000+5;
int nbVal,nbReq;
int memo[MAX_VAL][MAX_VAL];

int quest(int a,int b) {
    if (a>b) {
        return 1-quest(b,a);
    }
    if (memo[a][b]!=-1) {
        return memo[a][b];
    }
    if (Query(a,b)) {
        memo[a][b]=1;
    }
    else {
        memo[a][b]=0;
    }
    nbReq++;
    return memo[a][b];
}

vector<int> calc(vector<int> pers) {
    int taille=pers.size();
    if (taille==1) {
        return pers;
    }
    int mid=taille/2;
    vector<int> gau,dro,ans;
    for (int i=0;i<mid;i++) {
        gau.push_back(pers[i]);
    }
    for (int i=mid;i<taille;i++) {
        dro.push_back(pers[i]);
    }
    gau=calc(gau);
    dro=calc(dro);
    while (!gau.empty() or !dro.empty()) {
        if (gau.empty()) {
            ans.push_back(dro.back());
            dro.pop_back();
        }
        else if (dro.empty()) {
            ans.push_back(gau.back());
            gau.pop_back();
        }
        else {
            if (quest(gau.back(),dro.back())==1) {
                ans.push_back(gau.back());
                gau.pop_back();
            }
            else {
                ans.push_back(dro.back());
                dro.pop_back();
            }
        }
    }
    reverse(ans.begin(),ans.end());
    /*for (int i:ans) {
        cout<<i<<" ";
    }
    cout<<endl;*/
    return ans;
}

vector<int> Solve(int N) {
    nbVal=N;
    for (int i=0;i<nbVal;i++) {
        for (int j=0;j<nbVal;j++) {
            memo[i][j]=-1;
        }
    }
    vector<int> rep,init,ans;
    for (int i=0;i<nbVal;i++) {
        init.push_back(i);
    }
    srand(time(NULL));
    random_shuffle(init.begin(),init.end());
    rep=calc(init);
    /*for (int i:rep) {
        cout<<i<<" ";
    }
    cout<<endl;*/
    int pos=0,deb,fin;
    while (pos<nbVal) {
        deb=pos;
        if (deb==0) {
            vector<int> listeInf;
            for (int i=1;i<nbVal;i++) {
                if (quest(rep[0],rep[i])==1) {
                    listeInf.push_back(i);
                    //cout<<i<<" ";
                }
            }
            //cout<<endl;
            if (listeInf.size()==1) {
                fin=listeInf.back();
                vector<int> liste2;
                for (int i=0;i<nbVal;i++) {
                    if (i!=fin and quest(rep[fin],rep[i])==1) {
                        liste2.push_back(i);
                    }
                }
                if (liste2.size()==1) {
                    fin=0;
                }
                else {
                    fin=1;
                }
            }
            else {
                listeInf.pop_back();
                fin=listeInf.back();
            }
            pos=fin;
            while (deb<fin) {
                swap(rep[deb],rep[fin]);
                deb++;
                fin--;
            }
        }
        else {
            while (quest(rep[deb-1],rep[pos])==0) {
                pos++;
            }
            fin=pos;
            //cout<<deb<<" "<<fin<<endl;
            while (deb<fin) {
                swap(rep[deb],rep[fin]);
                deb++;
                fin--;
            }
        }
        pos++;
    }
    /*for (int i:rep) {
        cout<<i<<" ";
    }
    cout<<endl;*/
    ans.resize(nbVal);
    for (int i=0;i<nbVal;i++) {
        ans[rep[i]]=i;
    }
    /*for (int i:ans) {
        cout<<i<<" ";
    }
    cout<<endl;
    cout<<"Nombre de questions : "<<nbReq<<endl;*/
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...