제출 #972407

#제출 시각아이디문제언어결과실행 시간메모리
972407vjudge1Koala Game (APIO17_koala)C++14
77 / 100
67 ms600 KiB
#include "koala.h"

#include <bits/stdc++.h>

using namespace std;

int a[110], b[110];
int n;

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

int maxValue(int N, int W) {
   n=N;
   // TODO: Implement Subtask 2 solution here.
   // You may leave this function unmodified if you are not attempting this
   // subtask.
   for (int i=0; i<N; ++i){
      a[i]=1;
   }
   playRound(a, b);
   // for (int i=0; i<N; ++i) if (b[i]) cout << i+1 << ' ';
   // cout << '\n';
   for (int i=0; i<N; ++i){
      a[i]=(b[i]>a[i] && a[i])?2:0;
   }
   playRound(a, b);
   // for (int i=0; i<N; ++i) if (b[i]) cout << i+1 << ' ';
   // cout << '\n';
   for (int i=0; i<N; ++i){
      a[i]=(b[i]>a[i] && a[i])?4:0;
   }
   playRound(a, b);
   // for (int i=0; i<N; ++i) if (b[i]) cout << i+1 << ' ';
   // cout << '\n';
   for (int i=0; i<N; ++i){
      a[i]=(b[i]>a[i] && a[i])?11:0;
   }
   playRound(a, b);
   for (int i=0; i<N; ++i) if (b[i]>a[i] && a[i]) return i;
   // for (int i=0; i<N; ++i) if (b[i]) cout << i+1 << ' ';
   // cout << '\n';
   return 0;
}

bool ans[110];

int greaterValue(int N, int W) {
   n=N;
   // TODO: Implement Subtask 3 solution here.
   // You may leave this function unmodified if you are not attempting this
   // subtask.
   for (int i=0; i<N; ++i){
      a[i]=1;
   }
   playRound(a, b);
   if ((b[0]>a[0])!=(b[1]>a[1])){
      if (b[0]>a[0]) return 0;
      return 1;
   }
   if (b[0]>a[0] && b[1]>a[1]){
      for (int i=0; i<N; ++i) a[i]=(i==0 || i==1)?10:0;
      playRound(a, b);
      if (b[0]>a[0]) return 0;
      return 1;
   }
   // bitset<1225> bs[11];
   // for (int i=0; i<=10; ++i) bs[i].reset();
   // for (int v=1; v<=10; ++v){
   //    int cur=0;
   //    for (int x=0; x<N; ++x) for (int y=x+1; y<N; ++y) if (x<50 && y<50){
   //       for (int i=0; i<N; ++i) a[i]=(i==x || i==y)?v:0;
   //       playRound(a, b);
   //       bs[v].set(cur++, b[x]!=b[y]);
   //    }
   // }
   // for (int i=0; i<1024; ++i){
   //    bitset<1225> tot;
   //    for (int j=0; j<10; ++j) if (i>>j&1) tot|=bs[j+1];
   //    if (tot.all()){
   //       for (int j=0; j<10; ++j) if (i>>j&1) cout << j+1 << ' ';
   //       cout << '\n';
   //    }
   // }
   for (int v:{1, 3, 6}){
      for (int i=0; i<N; ++i) a[i]=(i==0 || i==1)?v:0;
      playRound(a, b);
      if ((b[0]>a[0])!=(b[1]>a[1])){
         if (b[0]>a[0]) return 0;
         return 1;
      }
   }
   return 0;
}

bool compare(int x, int y){
   if (ans[x]!=ans[y]){
      if (ans[x]) return 0;
      return 1;
   }
   if (ans[x] && ans[y]){
      for (int i=0; i<n; ++i) a[i]=(i==x || i==y)?10:0;
      playRound(a, b);
      if (b[x]>a[x]) return 0;
      return 1;
   }
   for (int v:{6, 3, 1}){
      for (int i=0; i<n; ++i) a[i]=(i==x || i==y)?v:0;
      playRound(a, b);
      if ((b[x]>a[x])!=(b[y]>a[y])){
         if (b[x]>a[x]) return 0;
         return 1;
      }
   }
   return 0;
}

void allValues(int N, int W, int *P) {
   n=N;
   if (W == 2*N) {
      // TODO: Implement Subtask 4 solution here.
      // You may leave this block unmodified if you are not attempting this
      // subtask.
      auto comp=[&](int x, int y) -> bool {
         for (int i=0; i<N; ++i) a[i]=(i==x || i==y)?100:0;
         playRound(a, b);
         return (b[y]>a[y]);
      };
      auto merge_sort=[&](auto self, vector<int> &v) -> void {
         int sz=(int)v.size();
         if (sz<=1) return;
         vector<int> vl(v.begin(), v.begin()+sz/2);
         vector<int> vr(v.begin()+sz/2, v.end());
         self(self, vl);
         self(self, vr);
         merge(vl.begin(), vl.end(), vr.begin(), vr.end(), v.begin(), comp);
      };
      vector<int> v(N);
      iota(v.begin(), v.end(), 0);
      merge_sort(merge_sort, v);
      for (int i=0; i<N; ++i) P[v[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){
         a[i]=1;
      }
      playRound(a, b);
      for (int i=0; i<n; ++i) ans[i]=b[i]>a[i];
      auto merge_sort=[&](auto self, vector<int> &v) -> void {
         int sz=(int)v.size();
         if (sz<=1) return;
         vector<int> vl(v.begin(), v.begin()+sz/2);
         vector<int> vr(v.begin()+sz/2, v.end());
         self(self, vl);
         self(self, vr);
         merge(vl.begin(), vl.end(), vr.begin(), vr.end(), v.begin(), compare);
      };
      mt19937 rng(69420);
      vector<int> v(N);
      iota(v.begin(), v.end(), 0);
      shuffle(v.begin(), v.end(), rng);
      merge_sort(merge_sort, v);
      for (int i=0; i<N; ++i) P[v[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...