为什么就过了
查看原帖
为什么就过了
444707
Alphys楼主2022/10/13 13:36

这样

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 5e4+10;
multiset<int> g[MAXN];
vector<pair<int,int> > gg[MAXN];
int n,m,ret;
void dfs(int u,int p,int fr,int minn){
	for(pair<int,int> e:gg[u]){
		int v=e.second;
		if(v==p)continue;
		dfs(v,u,e.first,minn);
	}
	for(auto it=g[u].lower_bound(minn);it!=g[u].end();it++,ret++)g[u].erase(it);
	for(auto it=g[u].begin();it!=g[u].end();){
		auto pos=g[u].lower_bound(minn-(*it));
		if(pos==it)pos++;
		if(pos!=g[u].end()){
			g[u].erase(pos);
			auto is=it;
			it++;
			g[u].erase(is);
			ret++;
		}
		else it++;
	}
	if(!g[u].empty()){
		auto lst=g[u].end();
		lst--;
		fr+=*lst;
	}
	g[p].insert(fr);
}
int main(){
	scanf("%d%d", &n, &m);
	int sum=0;
	for(int i=1;i<n;i++){
		int u,v,val;
		scanf("%d%d%d", &u, &v, &val);
		gg[u].push_back(make_pair(val,v));
		gg[v].push_back(make_pair(val,u));
		sum+=val;
	}
	int l=1,r=sum,mid;
	while(l<r){
		mid=(l+r+1)/2;
		for(int i=0;i<=n;i++)g[i].clear();
		ret=0;
		dfs(1,0,0,mid);
		if(ret>=m)l=mid;
		else r=mid-1;
	}
	printf("%d", l);
	return 0;
}

就15pts,RE了

但将13行,26~32行改为

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 5e4+10;
multiset<int> g[MAXN];
vector<pair<int,int> > gg[MAXN];
int n,m,ret;
void dfs(int u,int p,int fr,int minn){
	for(pair<int,int> e:gg[u]){
		int v=e.second;
		if(v==p)continue;
		dfs(v,u,e.first,minn);
	}
	//for(auto it=g[u].lower_bound(minn);it!=g[u].end();it++,ret++)if(it!=g[u].end())g[u].erase(it);
	for(auto it=g[u].begin();it!=g[u].end();){
		auto pos=g[u].lower_bound(minn-(*it));
		if(pos==it)pos++;
		if(pos!=g[u].end()){
			g[u].erase(pos);
			auto is=it;
			it++;
			g[u].erase(is);
			ret++;
		}
		else it++;
	}
	if(!g[u].empty()){
		auto lst=g[u].end();
		lst--;
		fr+=*lst;
	}
	if(fr>=minn)ret++;
	else g[p].insert(fr);
}
int main(){
	scanf("%d%d", &n, &m);
	int sum=0;
	for(int i=1;i<n;i++){
		int u,v,val;
		scanf("%d%d%d", &u, &v, &val);
		gg[u].push_back(make_pair(val,v));
		gg[v].push_back(make_pair(val,u));
		sum+=val;
	}
	int l=1,r=sum,mid;
	while(l<r){
		mid=(l+r+1)/2;
		for(int i=0;i<=n;i++)g[i].clear();
		ret=0;
		dfs(1,0,0,mid);
		if(ret>=m)l=mid;
		else r=mid-1;
	}
	printf("%d", l);
	return 0;
}

就过了

2022/10/13 13:36
加载中...