#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pi;
vector<int>arr;
bool pos(ll s,ll ride){
if(s<arr.back()) return 0;
ll r = 0;
multiset<int>st(arr.begin(),arr.end());
while(st.size()){
r++;
int cur = *st.begin();
if(cur>s) return 0;
st.erase(st.begin());
if(st.size()==0) break;
auto it = st.upper_bound(s-cur);
if(it==st.begin()) continue;
st.erase(prev(it));
}
return r<=ride;
}
ll f(ll ride){
ll l = 0;
ll r = INT32_MAX;
while(l<=r){
ll mid = (l+r)>>1;
if(!pos(mid,ride)) l = mid+1;
else r = mid-1;
}
return ride*l;
}
int main(){
ios_base::sync_with_stdio(false); cin.tie(NULL);
int n; cin>>n;
map<int,int>m;
for(int i=1; i<=n; i++){
int a; cin>>a;
m[a]++;
}
for(auto p : m) arr.push_back(p.second);
sort(arr.begin(),arr.end());
if(arr.size()==1){
cout<<arr.back();
return 0;
}
ll ans = INT64_MAX;
for(int i=(arr.size()/2+arr.size()%2); i<=arr.size(); i++){
ans = min(ans,f(i));
}
cout<<ans;
}
https://mirror.codeforces.com/problemset/problem/1250/B
this problem has no editorial. i just iterated all possible r and calculate minimum s with binary search
doing binary search, i greedily tried to take two teams at one ride if it's possible. if s is fixed and current team has c member, i checked whether there's a team with maximum number of members d <= (s-c) if there's such team, two team can ride together, otherwise just take one time at this ride.
is it logically wrong? or implementation is wrong? need help! (also i wanna know if there's a solution with complexity k^2 or faster , since my code is too slow )