제출 #701296

#제출 시각아이디문제언어결과실행 시간메모리
701296Abrar_Al_Samit코알라 (APIO17_koala)C++17
100 / 100
48 ms348 KiB
#include "koala.h" #include<bits/stdc++.h> using namespace std; int lim[101]; int minValue(int N, int W) { int B[N], R[N]; for(int i=0; i<N; ++i) { B[i] = R[i] = 0; } B[0] = 1; playRound(B, R); if(R[0]<=1) { return 0; } for(int i=1; i<N; ++i) { if(R[i]==0) return i; } } int maxValue(int N, int W) { int B[N] = {0}, R[N] = {0}; set<int>s; for(int i=0; i<N; ++i) { s.insert(i); } while(s.size()>1) { int val = W / s.size(); memset(B, 0, sizeof B); memset(R, 0, sizeof R); for(int x : s) { B[x] = val; } playRound(B, R); set<int>new_s; for(int i=0; i<N; ++i) if(R[i]>B[i]) { if(s.count(i)) new_s.insert(i); } s = new_s; } return *s.begin(); } int greaterValue(int N, int W) { int B[N] = {0}, R[N] = {0}; int l = 1, r = 13; while(l<r) { int mid = (l+r)/2; B[0] = B[1] = mid; playRound(B, R); if(B[0]<R[0] && B[1]<R[1]) { l = mid+1; } else if(B[0]>=R[0] && B[1]>=R[1]) { r = mid-1; } else { if(R[0]>B[0]) return 0; return 1; } } } void solve(set<int>s, int *P, int mx, int N, int W) { if(s.size()==1) { P[*s.begin()] = mx; return; } int B[N] = {0}, R[N] = {0}; int val = W / s.size(); val = min(val, lim[mx]); for(int j : s) { B[j] = val; } playRound(B, R); set<int>bigger; for(int j : s) { if(R[j]>B[j]) { bigger.insert(j); } } for(int x : bigger) { s.erase(x); } solve(bigger, P, mx, N, W); mx -= bigger.size(); solve(s, P, mx, N, W); } bool cmp(int i, int j) { int B[100] = {0}, R[100] = {0}; B[i] = B[j] = 100; playRound(B, R); if(R[i]>B[i]) return false; return true; } // void m_sort(vector<int>&order, int l, int r) { // if(l==r) return; // int m = (r-l+1)/2; // m_sort(order, l, l+m), m_sort(order, l+m+1, r); // vector<int>t1, t2; // for(int i=l; i<=l+m; ++i) t1.push_back(order[i]); // for(int i=l+m+1; i<=r; ++i) t2.push_back(order[i]); // reverse(t1.begin(), t1.end()); // reverse(t2.begin(), t2.end()); // int p = l; // while(!t1.empty() || !t2.empty()) { // if(t1.empty()) { // order[p] = t2.back(); // t2.pop_back(); // ++p; // } else if(t2.empty()) { // order[p] = t1.back(); // t1.pop_back(); // ++p; // } else { // if(cmp(t1.back(), t2.back())) { // order[p] = t1.back(); // t1.pop_back(); // ++p; // } else { // order[p] = t2.back(); // t2.pop_back(); // ++p; // } // } // } // } void merge(int arr[], int p, int q, int r) { // Create L ← A[p..q] and M ← A[q+1..r] int n1 = q - p + 1; int n2 = r - q; int L[n1], M[n2]; for (int i = 0; i < n1; i++) L[i] = arr[p + i]; for (int j = 0; j < n2; j++) M[j] = arr[q + 1 + j]; // Maintain current index of sub-arrays and main array int i, j, k; i = 0; j = 0; k = p; // Until we reach either end of either L or M, pick larger among // elements L and M and place them in the correct position at A[p..r] while (i < n1 && j < n2) { if (cmp(L[i], M[j])) { arr[k] = L[i]; i++; } else { arr[k] = M[j]; j++; } k++; } // When we run out of elements in either L or M, // pick up the remaining elements and put in A[p..r] while (i < n1) { arr[k] = L[i]; i++; k++; } while (j < n2) { arr[k] = M[j]; j++; k++; } } // Divide the array into two subarrays, sort them and merge them void mergeSort(int arr[], int l, int r) { if (l < r) { // m is the point where the array is divided into two subarrays int m = l + (r - l) / 2; mergeSort(arr, l, m); mergeSort(arr, m + 1, r); // Merge the sorted subarrays merge(arr, l, m, r); } } void allValues(int N, int W, int *P) { if (W == 2*N) { int order[N]; iota(order, order+N, 0); mergeSort(order, 0, N-1); for(int i=0; i<N; ++i) { P[order[i]] = i+1; } } else { int S = 0; for(int i=1, cur=1; i<=N; ++i) { if(i>S) S += cur, ++cur; lim[i] = cur-2; } set<int>s; for(int i=0; i<N; ++i) { s.insert(i); } solve(s, P, N, N, W); } }

컴파일 시 표준 에러 (stderr) 메시지

koala.cpp: In function 'int minValue(int, int)':
koala.cpp:21:1: warning: control reaches end of non-void function [-Wreturn-type]
   21 | }
      | ^
koala.cpp: In function 'int greaterValue(int, int)':
koala.cpp:71:1: warning: control reaches end of non-void function [-Wreturn-type]
   71 | }
      | ^
#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...