求助,最后四个点WA
查看原帖
求助,最后四个点WA
142327
C6H2CH3_NO2_3楼主2021/6/28 11:26
#include<bits/stdc++.h>
#define ll long long
#define maxn 50015
#define maxm maxn
#define mid (((l)+(r))/2)
using  namespace std;
ll read(){
	ll f=1,k=0;
	char c=0;
	while(c<'0'||c>'9'){
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		k=k*10+c-'0';
		c=getchar();
	}
	return k*f;
}
void out(ll x){
	if(x<0){
		x=-x;
		putchar('-');
	}
	if(x>=10)out(x/10);
	putchar(x%10+'0');
}
ll n,m,tot,Head[maxn],To[maxm<<1],Next[maxm<<1],C[maxm<<1],l,r,ans,val[maxn],cnt;
bool vst[maxn],bo[maxn];
void add(ll a,ll b,ll c){
	tot++;
	Next[tot]=Head[a];
	Head[a]=tot;
	To[tot]=b;
	C[tot]=c;
}
ll chkmax(ll a,ll b){
	return (a>b?a:b);
}
void dfs(ll s){
	priority_queue< ll >q;
	//ll kk=0;
	for(ll i=Head[s];i;i=Next[i]){
		ll k=To[i];
		if(vst[k])continue;
		vst[k]=1;
		dfs(k);
		if(C[i]+val[k]>=mid){
			cnt++;
		}
		else {q.push(C[i]+val[k]);}
		vst[k]=0;
	}
    vector< ll >vec;
	//vec.push_back(22);
	while(q.size()){
    vec.push_back(q.top());
	q.pop();
	}
	ll kl=vec.size(),i,j=kl-1;
	for(i=0;i<j;i++){
        for(j=kl-1;j>i;j--){
            if(vec[i]+vec[j]>=mid){
				bo[i]=bo[j]=1;
				kl=j;
				cnt++;
				break;
			}
		}
	}
	ll ansp=0;
	for(ll i=0;i<vec.size();i++){
		if(bo[i]){
			bo[i]=0;
			continue;
		}
		ansp=vec[i];
		break;
	}
	val[s]=ansp;
}
bool chkmid(){
	cnt=0;
	ll kt=rand()%n+1;
	vst[kt]=1;
    dfs(kt);
	vst[kt]=0;
	if(cnt>=m)return 1;
	return 0;
}
int main(){
	srand(time(0));
//	freopen("f.in","r",stdin);
    n=read();m=read();
	for(ll i=1;i<n;i++){
		ll a=read(),b=read(),c=read();
		r+=c;
		add(a,b,c);
		add(b,a,c);
	}
    l=0;
	while(l<=r){
		//cout<<"For "<<mid<<endl;
		if(chkmid()){
			ans=mid;
			l=mid+1;
		}
		else r=mid-1;
	}
	cout<<ans<<endl;
	return 0;
}
2021/6/28 11:26
加载中...