Submission #745055

#TimeUsernameProblemLanguageResultExecution timeMemory
745055TrunktyKoala Game (APIO17_koala)C++14
90 / 100
3054 ms456 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
//#define int ll

#include "koala.h"

int B[100],R[100];

int minValue(int N, int W){
    B[0] = 1;
    for(int i=1;i<=99;i++){
        B[i] = 0;
    }
    playRound(B,R);
    for(int i=0;i<=99;i++){
        if(R[i]==0){
            return i;
        }
    }
    return 0;
}

int maxValue(int N, int W){
    vector<int> curr;
    for(int i=0;i<=99;i++){
        curr.push_back(i);
    }
    while(curr.size()>1){
        for(int i=0;i<=99;i++){
            B[i] = 0;
        }
        int cnt = 100/curr.size();
        for(int i:curr){
            B[i] = cnt;
        }
        playRound(B,R);
        vector<int> curr2;
        for(int i:curr){
            if(R[i]>B[i]){
                curr2.push_back(i);
            }
        }
        curr = curr2;
    }
    return curr[0];
}

int greaterValue(int N, int W){
    int low=0,high=6;
    vector<int> v = {1,2,3,4,5,6,8};
    while(1){
        int mid = (low+high)/2;
        for(int i=0;i<=99;i++){
            B[i] = 0;
        }
        B[0] = v[mid];
        B[1] = v[mid];
        playRound(B,R);
        if(R[0]>B[0] and R[1]>B[1]){
            low = mid+1;
        }
        else if(R[0]<=B[0] and R[1]<=B[1]){
            high = mid-1;
        }
        else if(R[0]>B[0]){
            return 0;
        }
        else{
            return 1;
        }
    }
    return 0;
}

int n,w;
int arr[100];

void dosplit(vector<int> x, int l, int r){
    if(l==1 and r==2){
        for(int i=0;i<=n-1;i++){
            B[i] = 0;
        }
        B[x[0]] = 1;
        playRound(B,R);
        if(R[x[0]]>B[x[0]]){
            arr[x[0]] = 2;
            arr[x[1]] = 1;
        }
        else{
            arr[x[1]] = 2;
            arr[x[0]] = 1;
        }
        return;
    }
    if(x.size()==1){
        arr[x[0]] = l;
        return;
    }
    int val=1;
    for(int i=2;i<=1e9;i++){
        int curr = r+1-i*(r-l+1);
        int tot=0;
        for(int j=l-curr-1;j>=l-curr-i;j--){
            tot += j;
        }
        if(tot>l){
            val = i-1;
            break;
        }
    }
    for(int i=0;i<=n-1;i++){
        B[i] = 0;
    }
    for(int i:x){
        B[i] = val;
    }
    playRound(B,R);
    vector<int> x1,x2;
    for(int i:x){
        if(R[i]>B[i]){
            x2.push_back(i);
        }
        else{
            x1.push_back(i);
        }
    }
    dosplit(x1,l,l+x1.size()-1);
    dosplit(x2,r-x2.size()+1,r);
}

void allValues(int N, int W, int *P){
    n = N;
    w = W;
    if(W==2*N){
        vector<int> v;
        for(int i=0;i<N;i++){
            v.push_back(i);
        }
        dosplit(v,1,N);
        for(int i=0;i<N;i++){
            P[i] = arr[i];
        }
    } 
    else{
        vector<int> v;
        for(int i=0;i<N;i++){
            v.push_back(i);
        }
        dosplit(v,1,N);
        for(int i=0;i<N;i++){
            P[i] = arr[i];
        }
    }
}
#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...