社区讨论

神奇二分80分求助!

P14575坤班参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mibl5b75
此快照首次捕获于
2025/11/23 18:38
3 个月前
此快照最后确认于
2025/11/23 20:05
3 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int n,m,res=0,tot[500010],cnt[500010],minn=INT_MAX,minid=0,ans=0;
long long min(long long x,long long y){
	return x<y?x:y;
}
struct node{
	int a,b,c;
}t[500010];
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>t[i].a>>t[i].b>>t[i].c,tot[t[i].a]+=t[i].b;
		if(t[i].c==1) cnt[t[i].a]++;
	}
	for(int i=1;i<=m;i++)
		if(tot[i]==0){
			cout<<0;
			return 0;
		}
	//for(int i=1;i<=m;i++)
	//	if(tot[i]<minn){
	//		minn=tot[i];
	//		minid=i;
	//	}
	minn=*min_element(tot+1,tot+m+1);
	for(int i=1;i<=m;i++) ans+=tot[i];
	long long l=1,r=min(ans,minn),res=0;
	while(l<=r){
		long long mid=(l+r)>>1;
		bool tf=0;
		for(int i=1;i<=m;i++){
			if(tot[i]<mid){
				tf=1;
				break;
			}
		}
		if(tf){
			r=mid-1;
			continue;
		}
		long long ls=0;
		for(int i=1;i<=m;i++) ls+=min(cnt[i],tot[i]-mid);
		if(ls>=mid){
			res=mid;
			l=mid+1;
		}else r=mid-1;
	}
	cout<<res;
	return 0;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...