Submission #1197431

#TimeUsernameProblemLanguageResultExecution timeMemory
1197431alexander707070Monster Game (JOI21_monster)C++20
82 / 100
34 ms428 KiB
#include<bits/stdc++.h>
#define MAXN 100007
#include "monster.h"

using namespace std;

namespace monster{
    int n;
    int perm[MAXN],val[MAXN];
    bool flip[MAXN];

    void shift(int l,int r){
        for(int i=r+1;i>=l+1;i--){
            perm[i]=perm[i-1];
        }
    }
}

vector<int> Solve(int N){
    using namespace monster;

    n=N;
    perm[0]=0;

    for(int i=1;i<n;i++){
        
        if(Query(perm[0],i)){
            shift(0,i-1);
            perm[0]=i;
        }else if(Query(i,perm[i-1])){
            perm[i]=i;
        }else{
            int l=0,r=i-1,tt;

            while(l+1<r){
                tt=(l+r)/2;

                if(Query(perm[tt],i)){
                    r=tt;
                }else{
                    l=tt;
                }
            }

            shift(r,i-1);
            perm[r]=i;
        }
    }


    int last=0,br=0;

    vector<int> pos;
    for(int i=1;i<n;i++){
        if(Query(perm[0],perm[i])){
            br++; pos.push_back(perm[i]);
        }
    }

    if(br==n-2){
        int rb=0;
        for(int f=0;f<n-1;f++){
            if(Query(perm[n-1],perm[f]))rb++; 
        }

        if(rb==br)last=n-1;
        else last=n;    
    }else if(br>=2)last=br+1;
    else{
        int rb=0;
        for(int f=0;f<n;f++){
            if(f==pos[0])continue;
            if(Query(pos[0],f))rb++;   
        }

        if(rb==1)last=1;
        else last=2;
    }

    reverse(perm,perm+last);

    last--;
    for(int i=last+1;i<n;i++){
        if(Query(perm[last],perm[i])){
            reverse(perm+last+1,perm+i+1);
            last=i;
        }
    }

    for(int i=0;i<n;i++)val[perm[i]]=i;

    vector<int> sol;
    for(int i=0;i<n;i++)sol.push_back(val[i]);
    return sol;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...