제출 #1189441

#제출 시각아이디문제언어결과실행 시간메모리
1189441Malix코알라 (APIO17_koala)C++20
100 / 100
36 ms460 KiB
#include "koala.h"
#include <bits/stdc++.h>
using namespace std;
 
typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vii;
typedef pair<int,int> pi;
typedef vector<pi> pii;
typedef tuple<ll,ll,ll> ti;
typedef vector<ll> li;
typedef vector<li> lii;
 
#define REP(i,a,b) for(int i=a;i<b;i++)
#define F first
#define S second
#define PB push_back
#define LSOne(s) ((s)&(-s))
 
ll INF=1000000000000000010;
int inf=1e9+10;
ll M=1e9+7;

int minValue(int N, int W) {
    int a[100],b[100];
    REP(i,1,100)a[i]=0;
    a[0]=1;
    playRound(a,b);
    int ans=0;
    REP(i,1,100)if(b[i]==0)ans=i;
    return ans;
}

int maxValue(int N, int W) {
    int a[100],b[100];
    REP(i,0,100)a[i]=1;
    playRound(a,b);
    memset(a,0,sizeof(a));
    REP(i,0,100)if(b[i]==2)a[i]=2;
    playRound(a,b);
    memset(a,0,sizeof(a));
    REP(i,0,100)if(b[i]==3)a[i]=4;
    playRound(a,b);
    memset(a,0,sizeof(a));
    REP(i,0,100)if(b[i]==5)a[i]=11;
    playRound(a,b);
    REP(i,0,100)if(b[i]==12)return i;
    return 0;
}

int greaterValue(int N, int W) {
    int a[100],b[100];
    int l=1,r=9;
    while(l!=r){
        int m=(l+r)/2;
        memset(a,0,sizeof(a));
        a[0]=m;a[1]=m;
        playRound(a,b);
        if(b[0]>b[1])return 0;
        if(b[0]<b[1])return 1;
        if(b[0]>m)l=m+1;
        else r=m-1;
    }
    a[0]=l;a[1]=l;
    playRound(a,b);
    if(b[0]>b[1])return 0;
    if(b[0]<b[1])return 1;
    return 0;
}

vi arr;

bool higher(int x,int y){
    int a[100],b[100];
    memset(a,0,sizeof(a));
    a[arr[x]]=100;a[arr[y]]=100;
    playRound(a,b);
    return b[arr[x]]<b[arr[y]];
}

void st(int l,int r){
    if(l==r)return;
    int m=(l+r)/2;
    st(l,m);
    st(m+1,r);
    vi b(arr.begin()+l,arr.begin()+r+1);
    int pos=0,t=l;
    REP(i,m+1,r+1){
        while(l<=m&&higher(l,i)){
            b[pos]=arr[l];
            pos++;l++;
        }
        b[pos]=arr[i];
        pos++;
    }
    REP(i,l,m+1){
        b[pos]=arr[i];
        pos++;
    }
    REP(i,t,r+1)arr[i]=b[i-t];
}

vi X={1,1,1,1,1,1,1,1,1,2,1,1,2,3,3,1,3,1,1,2,3,4,2,3,4,4,1,2,3,3,4,1,5,1,2,2,3,5,3,4,5,2,5,2,3,4,5,4,4,6,1,2,3,5,6,3,4,6,5,6,1,4,5,6,1,7,1,2,2,2,3,4,5,7,3,4,7,5,6,7,2,5,6,7,2,2,3,4,5,6,8,3,4,6,8,5,8,6,8,};
int ps=0;

void solve(int l,int r){
    if(l==r)return;
    int a[100],b[100];
    memset(a,0,sizeof(a));
    REP(j,l,r+1)a[arr[j]]=X[ps];
    playRound(a,b);
    vi tmp;
    REP(j,l,r+1)if(b[arr[j]]<=X[ps])tmp.PB(arr[j]);
    int m=tmp.size();
    REP(j,l,r+1)if(b[arr[j]]>X[ps])tmp.PB(arr[j]);
    REP(j,l,r+1)arr[j]=tmp[j-l];
    ps++;
    solve(l,l+m-1);
    solve(l+m,r);
}

void allValues(int N, int W, int *P) {
    if (W == 2*N) {
        arr.resize(N);
        REP(i,0,N)arr[i]=i;
        st(0,N-1);
        REP(i,0,N)P[arr[i]]=i+1;
    } 
    else {
        arr.resize(N);
        REP(i,0,N)arr[i]=i;
        solve(0,N-1);
        REP(i,0,N)P[arr[i]]=i+1;
    }
}
#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...