제출 #745056

#제출 시각아이디문제언어결과실행 시간메모리
745056Trunkty코알라 (APIO17_koala)C++14
100 / 100
65 ms444 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 dosplit2(vector<int> x, int l, int r){ if(x.size()==1){ arr[x[0]] = l; return; } int low=1,high=w/(r-l+1); while(1){ int mid=(low+high)/2; for(int i=0;i<=n-1;i++){ B[i] = 0; } for(int i:x){ B[i] = mid; } 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); } } if(x1.size()>0 and x2.size()>0){ dosplit2(x1,l,l+x1.size()-1); dosplit2(x2,r-x2.size()+1,r); break; } else if(x1.size()>0){ high = mid-1; } else{ low = mid+1; } } } 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); } dosplit2(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...