这是我第一遍写的代码,得了60分
#include <bits/stdc++.h>
#define ri register int
#define ll long long
using namespace std;
/*
每道题check的步骤:
1.maxn
2.有无mod
3.图是否联通
4.数据最大值(有无超int/ll/int128)
*/
const int maxn=1e6+5;
int n,k;
int a[maxn],b[maxn],c[maxn],d[maxn],e[maxn];
signed main(){
ios::sync_with_stdio(0);
cin>>n>>k;
for(ri i=1;i<=n;i++){cin>>a[i];b[a[i]]++;}
for(ri i=1;i<=n;i++)c[b[i]]+=1;
for(ri i=1;i<=n;i++)c[i]+=c[i+1];
for(ri i=n;i>=1;i--)d[i]=c[i]+d[i+1];
for(ri i=1;i<=n;i++)if(d[i])e[d[i]]=i;
for(ri i=1;i<=n;i++)
if(!e[i])e[i]=e[i-1];
int maxi=0;
for(ri i=1;i<=n;i++)maxi=max(b[i],maxi);
for(ri i=0;i<=n;i++){
if(!e[i])e[i]=maxi;
else e[i]--;
}
maxi=e[k];
if(k>=maxi){cout<<"pigstd";return 0;}
int cnt=0;
for(ri i=1;i<=n;i++){
if(b[i]+k>=maxi)cnt++;
}
cout<<cnt;
return 0;
}
这是我第二遍写的代码,得了100分
#include <bits/stdc++.h>
#define ri register int
#define ll long long
using namespace std;
/*
每道题check的步骤:
1.maxn
2.有无mod
3.图是否联通
4.数据最大值(有无超int/ll/int128)
*/
const int maxn=1e6+5;
int n,k;
int a[maxn],b[maxn],c[maxn];
signed main(){
ios::sync_with_stdio(0);
cin>>n>>k;
for(ri i=1;i<=n;i++){cin>>a[i];b[a[i]]++;}
sort(b+1,b+n+1);
for(ri i=1;i<=n/2;i++)swap(b[i],b[n-i+1]);
int cnt=0;
for(ri i=1;i<=n;i++)cnt+=(b[i]?1:0);
n=cnt;
sort(b+1,b+1+n);
for(ri i=1;i<=n;i++)c[i]=c[i-1]+b[i];
cnt=0;
for(ri i=1;i<=n+1;i++){
int t=b[i]+k,kk=k;
int fd=upper_bound(b+1,b+1+n,t)-b;
kk-=c[n]-c[fd-1]-t*(n-fd+1);
if(kk>=0){
cnt++;
if(b[i]==0){cout<<"pigstd";return 0;}
}
}cout<<cnt;return 0;
}
显然,两份代码思路基本相同,无非是把判断的方式改了改,并将 O(n) 换成 O(nlogn) ,但第一份就是出问题了,于是感到十分疑惑,因此在这里求一下调第一份代码的方法或给一个能hack掉第一份代码的数据