比赛 2024暑假C班集训B 评测结果 WWWWWWWEWWEWWWWWWWWE
题目名称 赛道修建 最终得分 0
用户昵称 李奇文 运行时间 0.720 s
代码语言 C++ 内存使用 3.77 MiB
提交时间 2024-07-11 10:09:01
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
int n,m,hd[50005],tot=1,sum,sum1=1;
struct node{
	int a,b,l,nxt;
}e[50005];
void adde(int x,int y,int z){
	e[tot].a=x,e[tot].b=y,e[tot].l=z,e[tot].nxt=hd[x],hd[x]=tot++;
}
int a1[50005],s,b1[50005];
void dfs(int x,int f){
    for(int i=hd[x],y;i;i=e[i].nxt){
        y=e[i].b;
        if(y==f) continue;
        dfs(y,x);
        a1[x]=e[i].l;
        s+=a1[x];
	}
}
void solve1(){
    dfs(1,0);
    int r=s/m,mins,minn;
    for(int i=1;i<n;i++){
    	b1[i]+=a1[i];
	}
    for(int i=1;i<n;i++){
    	for(int j=i;j<n;j++){
    		if(abs(b1[j]-b1[i-1]-r)<mins){
    			minn=b1[j]-b1[i-1];
    			mins=abs(b1[j]-b1[i-1]);
			}
		}
	}
	cout<<minn<<endl;
    return;
}
int Max,st[50005];
void dfs1(int id,int x,int fa,long long summ){
	int cnt=0;
	for(int i=hd[i];i;i=e[i].nxt){
		int y=e[i].b;
		long long z=e[i].l;
		if(y!=fa) dfs1(id,y,x,summ+z),cnt++;
	}
	if(!cnt&&summ>Max) Max=summ,st[id]=x;
}
bool cmp(int x,int y){
	return x>y;
}
int main(){
	freopen("2018track.in","r",stdin);
	freopen("2018track.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<n;i++){
		int x,y,z;
		sum+=y-x;
		sum1=max(sum1,x);
		adde(x,y,z);
		adde(y,x,z);
	}
	if(sum==n-1){
		solve1();
	}else if(sum1==1){
		cout<<"你看我是能AC这种题的人吗qwq"<<endl; 
	}else if(m==1){
		st[0]=1;
		for(int i=1;i<=n;++i){
			Max=0;
			dfs1(i,st[i-1],0,0);
		}
	}
	return 0;
}