제출 #305572

#제출 시각아이디문제언어결과실행 시간메모리
305572sofapudenKoala Game (APIO17_koala)C++14
100 / 100
91 ms636 KiB
#include "koala.h"
#include <bits/stdc++.h>

using namespace std;

int arr1[100], arr2[100];
vector<int> ord;
set<int> used;
vector<int> glo;
int n, w;

int minValue(int N, int W) {
    // TODO: Implement Subtask 1 solution here.
    // You may leave this function unmodified if you are not attempting this
    // subtask.
    for(int i = 0; i < N; ++i){
		arr1[i] = 0;
	}
    arr1[0] = 1;
    playRound(arr1, arr2);
    for(int i = 0; i < N; ++i){
		if(arr2[i] <= arr1[i])return i;
	}
    return 0;
}

int maxValue(int N, int W) {
    // TODO: Implement Subtask 2 solution here.
    // You may leave this function unmodified if you are not attempting this
    // subtask.
    vector<int> go(N);
    iota(go.begin(),go.end(),0);
    int sz = go.size();
    while(sz != 1){
		for(int i = 0; i < N; ++i){
			arr1[i] = 0;
			arr2[i] = 0;
		}
		for(int i = 0; i < sz; ++i){
			arr1[go[i]] = W/sz;
		}
		playRound(arr1,arr2);
		go.clear();
		for(int i = 0; i < N; ++i){
			if(arr2[i] > arr1[i] && arr1[i] > 0)go.push_back(i);
		}
		sz = go.size();
	}
	return go[0];
}

int greaterValue(int N, int W) {
    // TODO: Implement Subtask 3 solution here.
    // You may leave this function unmodified if you are not attempting this
    // subtask.
    memset(arr1,0,N);
    arr1[0] = 4;
    arr1[1] = 4;
    playRound(arr1,arr2);
    if(arr2[0] <= 4 && arr2[1] <= 4){
		arr1[0] = 2;
		arr1[1] = 2;
		playRound(arr1,arr2);
		if(arr2[0] <= 2 && arr2[1] <= 2){
			arr1[0] = 1;
			arr1[1] = 1;
			playRound(arr1,arr2);
			return arr2[1] > arr2[0];
		}
		if(arr2[0] > 2 && arr2[1] > 2){
			arr1[0] = 3;
			arr1[1] = 3;
			playRound(arr1,arr2);
			return arr2[1] > arr2[0];
		}
		return arr2[1] > arr2[0];
		
	}	
    if(arr2[0] > 4 && arr2[1] > 4){
		arr1[0] = 8;
		arr1[1] = 8;
		playRound(arr1,arr2);
		if(arr2[0] <= 8 && arr2[1] <= 8){
			arr1[0] = 6;
			arr1[1] = 6;
			playRound(arr1,arr2);
			return arr2[1] > arr2[0];
		}
		return arr2[1] > arr2[0];
	}
		
	return arr2[1] > arr2[0];
		
}

bool comp(int a, int b){
	for(int i = 0; i < n; ++i){
		arr1[i] = 0;
	}
	arr1[a] = arr1[b] = n;
	playRound(arr1,arr2);
	return arr2[a] < arr2[b];
}
void solve(int l, int r){
	if(l == r)return;
	memset(arr1,0,sizeof arr1);
	vector<int> a, b;
	int cn = 0;
	int us = 0;
	while(us <= n-r){
		cn++;
		us+=cn;
	}
	us-=cn;
	cn--;
	cn = min(w/(r-l+1),cn);
	for(int i = l; i <= r; ++i){
		arr1[glo[i]] = cn;
	}
	playRound(arr1, arr2);
	for(int i = l; i <= r; ++i){
		if(arr2[glo[i]] > arr1[glo[i]]){
			a.push_back(glo[i]);
		}
		else{
			b.push_back(glo[i]);
		}
	}
	for(int i = l; i < l+(int)a.size(); ++i){
		glo[i] = a[i-l];
	}
	for(int i = l+a.size(); i <= r; ++i){
		glo[i] = b[i-l-a.size()];
	}
	solve(l,a.size()+l-1);
	solve(a.size()+l,r);
}

void allValues(int N, int W, int *P) {
	n = N;w = W;
	if(N*2 == W){
		// TODO: Implement Subtask 4 solution here.
        // You may leave this block unmodified if you are not attempting this
        // subtask.
		vector<int> x(N);
		iota(x.begin(),x.end(),0);
		stable_sort(x.begin(),x.end(),comp);
		for(int i = 0; i < N; ++i){
			P[x[i]] = i+1;
		}
	}
	else {
        // TODO: Implement Subtask 5 solution here.
        // You may leave this block unmodified if you are not attempting this
        // subtask.
        for(int i = 0; i < N; ++i){
			glo.push_back(i);
		}
        solve(0,N-1);
        for(int i = 0; i < N; ++i){
			P[glo[i]] = N-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...