请问一下这个二分哪里有问题吗QWQ
查看原帖
请问一下这个二分哪里有问题吗QWQ
672837
DaShabby楼主2023/7/22 17:27
#include<bits/stdc++.h>
#define x first
#define y second
#define inf 0x3f3f3f3f
#define lowbit(x) ((x)&(-x))
#define lson node<<1
#define rson node<<1|1
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pii;
const int maxn=1e6+34;
ll idx,tot;
ll MOD=1e9+7;
//vector<int>G[maxn];
ll a[maxn],vis[maxn],num[maxn];
char s[20];
int check(ll ans){
	ll sum=0;
	for(int i=1;i<=idx;i++){
		if(num[i]>ans)sum+=(num[i]-ans);
	}
	return sum<=ans;
}
int ask_inf(int n){
	ll l=1,r=n,ans=n+1;
	while(l<=r){
		ll mid=(l+r)/2;
		if(check(mid))r=mid-1,ans=mid;
		else l=mid+1;
	}
	return ans;
}
int ask(int id,ll m){
	ll need=0,had=num[id]+m;
	for(int i=idx;i>id;i--){
		if(num[i]>had)need+=num[i]-had;
	}
	return need<=had;
}
void ask_id(ll m){
	ll l=1,r=idx,ans=idx+1;
	while(l<=r){
		int mid=(l+r)/2;
		if(ask(mid,m))r=mid-1,ans=mid;
		else l=mid+1;
	}
	printf("%lld\n",idx-ans+1);
}
void work(){
	int n;
	ll m,u,v,x,k,y;
	scanf("%d%lld",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
		vis[a[i]]++;
	}
	sort(a+1,a+1+n);
	for(int i=1;i<=n;i++){
		if(a[i]==a[i-1])continue;
		num[++idx]=vis[a[i]];
	}
	if(m>=ask_inf(n)){
		printf("pigstd\n");return;
	}
	sort(num+1,num+idx+1);
	ask_id(m);
}
int main()
{
	int t=1;
//	scanf("%d",&t);
	while(t--)
	work();
	return 0;
} 
2023/7/22 17:27
加载中...