社区讨论
神奇二分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 条回复,欢迎继续交流。
正在加载回复...