MLE求助
查看原帖
MLE求助
537998
lpx2024楼主2023/2/26 08:25

用的二分全是mle,样例也过不了

#include<bits/stdc++.h>
using namespace std;
const int inf=50010;
int fa[inf],lef[inf],a,m,n,checkm;
struct node{
	int to;
	int data;
};
vector<node> v[inf];
void dfs(int x){
	for(int i=0;i<v[x].size();i++){
		if(v[x][i].to==fa[x]) continue;
		fa[v[x][i].to]=x;
		dfs(v[x][i].to);
	}
}
bool cmp(node n1,node n2){
	return lef[n1.to]>lef[n2.to];
}
void check(int x,int len){
	for(int i=0;i<v[x].size();i++){
		if(v[x][i].to==fa[x]) continue;
		check(v[x][i].to,len);
		lef[v[x][i].to]+=v[x][i].data;
	}
	sort(v[x].begin(),v[x].end(),cmp);
	int i=0,j=v[x].size()-1;
	while(lef[v[x][i].to]>=len){
		i++;
		checkm++;
	}
	while(lef[v[x][i].to]+lef[v[x][j].to]>=len && i<j){
		i++;
		j--;
		checkm++;
	}
	if(i<=j) lef[x]=lef[v[x][i].to];
}
int main(){
	cin>>n>>m;
	int l=1,r;
	for(int i=1;i<n;i++){
		int x,y,w;
		cin>>x>>y>>w;
		r+=w;
		v[x].push_back(node{y,w});
		v[y].push_back(node{x,w});
	}
	while(l<=r){
		int mid=(l+r)/2;
		memset(lef,0,sizeof(lef));
		checkm=0;
		check(1,mid);
		if(checkm>=m){
			a=mid;
			l=mid+1;
		}
		else r=mid-1;
	}
	cout<<a;
	return 0;
}
2023/2/26 08:25
加载中...