S考场上不知道为什么用了前缀和套二分挂成75pts了。(二分出一个数,小于它的数比大于它的数多,统计答案时可以把比它小的数加上比它大的数替换同等数量相加即被淘汰的数量)
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,a[100005],r[100005],b[100005],cnt,sum[100005];
signed main (){
freopen("duel.in","r",stdin);
freopen("duel.out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
for(register int i=1;i<=n;i++){
cin>>a[i];
r[a[i]]++;
}
for(register int i=1;i<=1e5;i++){
if(r[i]){
b[++cnt]=i;
}
sum[i]=sum[i-1]+r[i];
}
sort(a+1,a+n+1);
sort(b+1,b+cnt+1);
int pos=0,ans=0;
for(register int i=1;i<=cnt;i++){
ans=i;
pos=upper_bound(a+1,a+n+1,b[i])-a-1;
if(sum[a[pos]]>sum[a[n]]-sum[a[pos-1]]){
break;
}
}
cout<<n-(sum[b[ans-1]]+sum[b[cnt]]-sum[b[ans]])<<'\n';
return 0;
}
//10
//136 136 136 2417 136 136 2417 136 136 136
赛后发现正解是统计众数个数,wssb
但还是想知道是打法问题还是思路问题。