样例过0分附加点AC其余全WA求调(玄关)
查看原帖
样例过0分附加点AC其余全WA求调(玄关)
939292
chenshixue楼主2024/7/18 10:35
#include <bits/stdc++.h>
using namespace std;
const int maxn=300005;
int head[maxn],cnt=1,prel[maxn],ans[maxn],lst[maxn],dis[maxn],ed,st,maxlenson[maxn],que[maxn];
bool vis[maxn];
struct node{
	int to,next,w;
}tree[maxn*2];
void add(int u,int v,int w){
	tree[cnt].to=v;
	tree[cnt].next=head[u];
	tree[cnt].w=w;
	head[u]=cnt++;
}
void dfs(int u,int f,int w){
	dis[u]=dis[f]+w;
	lst[u]=f;
	prel[u]=w;
	for(int i=head[u];i!=0;i=tree[i].next){
		int v=tree[i].to;
		if(v!=f){
			dfs(v,u,tree[i].w);
		}
	}
}
int lenson(int u,int f,int w){
	int len=0;
	for(int i=head[u];i!=0;i=tree[i].next){
		int v=tree[i].to;
		if(v!=f&&!vis[v]){
			len=max(len,lenson(v,u,tree[i].w));
		}
	}
	return len+w; 
}
int main(){
	int n,s;
	cin>>n>>s;
	for(int i=1;i<n;i++){
		int u,v,w;
		cin>>u>>v>>w;
		add(u,v,w);
		add(v,u,w);
	}
	dfs(1,0,0);
	for(int i=1;i<=n;i++){
		if(dis[i]>dis[st]) st=i;
	}
	dfs(st,0,0);
	for(int i=1;i<=n;i++){
		if(dis[i]>dis[ed]) ed=i;
	}
	for(int i=ed;i!=st;i=lst[i]){
		vis[i]=1;
	}
	for(int i=lst[ed];i!=st;i=lst[i]){
		maxlenson[i]=lenson(i,0,0);
	}
	int head=1;
	int tail=1;
	que[tail++]=ed;
	int l=ed,r=ed,ans=INT_MAX;
	int ss=0,i=ed;
	while(i!=0){
		if(ss+prel[i]>s&&haed!=tail){
			r=i;
			int temp=max(max(dis[r],dis[ed]-dis[l]),maxlenson[que[head]]);
			ans=min(ans,temp);
			if(que[head]==l){
				head++;
			}
			ss-=prel[l];
			l=lst[l];
		}else{
			while(head!=tail&&maxlenson[que[tail]]<maxlenson[i]){
				tail--;
			}
			que[tail++]=i; 
			ss+=prel[i];
			i=lst[i];
		}
		
	}
	cout<<ans;
	return 0;
}

应该不用开LongLong吧

2024/7/18 10:35
加载中...