求助 本地跑过来,交上去WA,吸完氧RE
查看原帖
求助 本地跑过来,交上去WA,吸完氧RE
107154
daduoli楼主2022/11/3 14:09
#include<bits/stdc++.h>

using namespace std;
const int MAXN=50010;
int n,m;
int a,b,l,dp[MAXN],len[MAXN];
struct daduoli {
	int f,t,c;
}que[MAXN*2];
int cnt,h[MAXN];
void add(int f,int t,int c) {
	++cnt;
	que[cnt].f=h[f];
	que[cnt].t=t;
	que[cnt].c=c;
	h[f]=cnt;
}
void dfs(int node,int fa,int achieve) {
	vector<int> a;
	dp[node]=0;
	len[node]=0;
	for(int i=h[node];i;i=que[i].f) {
		int t=que[i].t;
		if(t==fa) continue;
		dfs(t,node,achieve);
		dp[node]+=dp[t];
		a.push_back(que[i].c+len[t]);
	}
	sort(a.begin(),a.end());
	int R=a.size();
	for(int i=R-1;i>=0;--i) {
		if(a[i]>=achieve) ++dp[node],R--;
		else break;
	}
	int nxt[R+2],pre[R+2],r=R-1;
	memset(nxt,0,sizeof(nxt));
	memset(pre,0,sizeof(pre));
	pre[R]=R-1;
	bool vis[R+2];
	memset(vis,0,sizeof(vis));
	vis[0]=0;
	for(int i=1;i<R;++i) pre[i]=i-1,vis[i]=0;
	for(int i=0;i<R;++i) nxt[i]=i+1;
	for(int i=1;i<R;++i) {
		if(a[i]+a[0]>=achieve) {
			r=i;
			break;
		}
	}
	for(int i=0;i<R;++i) {
		if(vis[i]) continue;
		while(a[i]+a[pre[r]]>=achieve&&pre[r]>i&&!vis[pre[r]])
			r=pre[r];
		if(a[i]+a[r]>=achieve||i>=r) {
			if(i>=r) r=nxt[i];
			if(vis[r]||r==R||a[i]+a[r]<achieve) continue;
			nxt[pre[r]]=nxt[r];
			pre[nxt[r]]=pre[r];
			nxt[pre[i]]=nxt[i];
			pre[nxt[i]]=pre[i];
			vis[i]=1;vis[r]=1;
			r=nxt[r];
			if(r==R) r=pre[R];
			++dp[node];
		}
	}
	for(int i=R-1;i>=0;--i) {
		if(!vis[i]) {
			len[node]=a[i];
			return ;
		}
	}
}
bool check(int k) {
	dfs(1,0,k);
	if(dp[1]>=m) return true;
	return false;
} 
int erfind() {
	int l,r=500000001,mid;
	while(l+1<r) {
		mid=(l+r)/2;
		if(check(mid)) l=mid;
		else r=mid;
	}
	return l;
}
int main() {
	cin>>n>>m;
	for(int i=1;i<n;++i) {
		cin>>a>>b>>l;
		add(a,b,l);
		add(b,a,l);
	}
	cout<<erfind();
	return 0;
} 
2022/11/3 14:09
加载中...