求助,第十一个点WA了
查看原帖
求助,第十一个点WA了
181521
珈乐唯毒楼主2020/10/25 12:17
#include<bits/stdc++.h>
#define int long long
const int N=300005;
using namespace std;
int ma,mb,mm;
struct tr{
	int ma,l,r;
}t[N<<3];
struct qj{
	int x,y;
}str[N];
bool cmp(qj i,qj j){
	return i.x<j.x;
}
int num;
int head[N],en;
int st[N][31],dep[N],len[N][31],size[N],son[N],fa[N],seg[N],rev[N],tot,top[N],ans;
struct Edge{
	int next,to,val;
}edge[N*2];
void add(int u,int v,int w){
	edge[++en].val=w;
	edge[en].to=v;
	edge[en].next=head[u];
	head[u]=en;
}
int n,m;
void build(int f,int u,int w){
	st[u][0]=f;
	len[u][0]=w;
	dep[u]=dep[f]+1;
	for(int i=1;i<=30;i++){
		if(!st[st[u][i-1]][i-1])
			break;
		st[u][i]=st[st[u][i-1]][i-1];
		if(st[u][i])len[u][i]=len[u][i-1]+len[st[u][i-1]][i-1];
	}
	for(int i=head[u];i;i=edge[i].next){
		int v=edge[i].to;
		if(f==v)continue;
		build(u,v,edge[i].val);
	}
}
int lca(int x,int y,int &w){
	w=0;
	if(dep[x]<dep[y])swap(x,y);
	for(int i=20;i>=0;i--)
		if(st[x][i]&&dep[st[x][i]]>=dep[y]){
			w+=len[x][i];
			x=st[x][i];
		}
	if(x==y)return x;
	for(int i=20;i>=0;i--)
		if(st[x][i]!=0&&st[x][i]!=st[y][i]){
			w+=len[x][i]+len[y][i];
			x=st[x][i];
			y=st[y][i];
		}
	w+=len[x][0]+len[y][0];
	return st[x][0];
}
int dfs1(int u){
	size[u]=1;
	for(int i=head[u];i;i=edge[i].next){
		int v=edge[i].to;
		if(v==fa[u])continue;
		fa[v]=u;
		size[u]+=dfs1(v);
		if(size[v]>size[son[u]])son[u]=v;
	}
	return size[u];
}
void dfs2(int u){
	if(son[u]){
		seg[son[u]]=++tot;
		rev[tot]=son[u];
		top[son[u]]=top[u];
		dfs2(son[u]);
	}
	for(int i=head[u];i;i=edge[i].next){
		int v=edge[i].to;
		if(v==fa[u]||v==son[u])continue;
		seg[v]=++tot;
		rev[tot]=v;
		top[v]=v;
		dfs2(v);
	}
}
void cl(int x,int y,int l){
	int fx=top[x],fy=top[y];
	num=0;
	while(fx!=fy){
		if(dep[fx]<dep[fy]){
			swap(fx,fy);
			swap(x,y);
		}
		if(fx!=l)str[++num].x=seg[fx]; 
		else str[++num].x=seg[fx]+1;
		str[num].y=seg[x];
		x=fa[top[x]];
		fx=top[x];
	}
	if(x==y)return;
	if(dep[x]<dep[y])swap(x,y);
	if(seg[x]<seg[y]+1)return;
	str[++num].x=seg[y]+1;
	str[num].y=seg[x];
}
void buil(int k){
	if(t[k].l==t[k].r)return;
	int mid=(t[k].l+t[k].r)>>1;
	t[k<<1].l=t[k].l;t[k<<1].r=mid;
	t[k<<1|1].l=mid+1;t[k<<1|1].r=t[k].r;
	buil(k<<1);buil(k<<1|1);
}
void pushdown(int k){
	t[k<<1].ma=max(t[k<<1].ma,t[k].ma);
	t[k<<1|1].ma=max(t[k<<1|1].ma,t[k].ma);
	t[k].ma=0;
}
void cm(int k,int l,int r,int ad){
	if(l>r)return;
	if(t[k].l>=l&&t[k].r<=r){
		t[k].ma=max(t[k].ma,ad);
		return;
	}
	pushdown(k);
	int mid=(t[k].l+t[k].r)>>1;
	if(mid>=l)cm(k<<1,l,r,ad);
	if(mid+1<r)cm(k<<1|1,l,r,ad);
	return;
}
int query(int k,int x){
	if(t[k].l==t[k].r)
		return t[k].ma; 
	pushdown(k);
	if(t[k<<1].r>=x)return query(k<<1,x);
	return query(k<<1|1,x);
}
void findans(int x,int y){
	ans=99999999999999;
	if(dep[x]<dep[y])swap(x,y);
	while(dep[x]>dep[y]){
		ans=min(max(query(1,seg[x]),mm-len[x][0]),ans);
		x=fa[x];
	}
	while(x!=y){
		ans=min(max(query(1,seg[x]),mm-len[x][0]),ans);
		x=fa[x];
		ans=min(max(query(1,seg[y]),mm-len[y][0]),ans);
		y=fa[y];
	}
}
signed main(){
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<n;i++){
		int u,v,w;
		scanf("%lld%lld%lld",&u,&v,&w);
		add(u,v,w);
		add(v,u,w);
	}
	build(0,1,0);
	dfs1(1);
	top[1]=1;
	seg[1]=++tot;
	rev[tot]=1;
	dfs2(1);
	t[1].l=1;
	t[1].r=n;
	buil(1);
	str[0].y=1;
	for(int i=1;i<=m;i++){
		int u,v;
		scanf("%lld%lld",&u,&v);
		int w,l=lca(u,v,w);
		if(w>mm){
			mm=w;
			ma=u;
			mb=v;
		}
		cl(u,v,l);
//		cout<<num<<endl;
		sort(str+1,str+num+1,cmp);
		str[++num].x=n+1;
		for(int i=1;i<=num;i++)cm(1,str[i-1].y+1,str[i].x-1,w);
	}
	findans(ma,mb);
	cout<<(ans==99999999999999?0:ans);
	return 0;
}

测试数据

2020/10/25 12:17
加载中...