ST表(bushi)出错求助,玄关
查看原帖
ST表(bushi)出错求助,玄关
777059
Lyu_Lintse楼主2024/11/25 15:26
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define mp make_pair
#define pii pair<int,int>
#define fi first
#define se second
const int mx=2e5+50;
int n,q,c[mx],u,vv,w;
int fa[mx][50],cost[mx][50],dep[mx],dp[mx],fdp[mx],st[mx][50];
vector<pii> v[mx];
void print(int i)
{
	cout<<i;
}
void dfsdp(int r,int f)
{
	dp[r]=c[r-1];
  	for(int i=0;i<v[r].size();i++)
  	{
  		if(v[r][i].fi==f)
  		{
  			continue;
		}
		dfsdp(v[r][i].fi,r);
		dp[r]=max(dp[r],dp[v[r][i].fi]-2*v[r][i].se);
	}
	fdp[r]=dp[r];
	return;
}
void dfsfdp(int r,int f)
{
	for(int i=0;i<v[r].size();i++)
  	{
  		if(v[r][i].fi==f)
  		{
  			fdp[r]=max(fdp[r],fdp[f]-2*v[r][i].se);
  			break;
		}
	}
	for(int i=0;i<v[r].size();i++)
  	{
  		if(v[r][i].fi==f)
  		{
  			continue;
		}
		dfsdp(v[r][i].fi,r);
	}
	return;
}
void mst()
{
	for(int i=1;i<=n;i++)
	{
		st[i][0]=dp[i];
	}
	for(int i=1;i<45;i++)
	{
		for(int j=1;j<=n;j++)
		{
			st[j][i]=max(st[j][i-1],st[fa[j][i-1]][i-1]);
		}
	}
}
void dfs(int r,int f)
{
	fa[r][0]=f;
	dep[r]=dep[fa[r][0]]+1;
	for (int i=1;i<45;++i)
	{
	    fa[r][i]=fa[fa[r][i-1]][i-1];
	    cost[r][i]=cost[fa[r][i-1]][i-1]+cost[r][i-1];
  	}
  	for(int i=0;i<v[r].size();i++)
  	{
  		if(v[r][i].fi==f)
  		{
  			continue;
		}
		cost[v[r][i].fi][0]=v[r][i].se;
		dfs(v[r][i].fi,r);
	}
}
pii lca(int x,int y)
{
	if(dep[x]>dep[y]) 
	{
		swap(dep[x],dep[y]);
	}
	int tmp=dep[y]-dep[x],ans=0;
	for(int i=0;tmp;i++,tmp>>=1)
	{
		if(tmp&1)
		{
			ans+=cost[y][i];
			y=fa[y][i];
		}
	}
	if(x==y)
	{
		return mp(ans,x);
	}
	for(int i=44;i>=0 and y!=x;i--)
	{
		if(fa[x][i]!=fa[y][i])
		{
			ans+=cost[x][i]+cost[y][i];
			x=fa[x][i];
			y=fa[y][i];
		}
	}
	ans+=cost[x][0]+cost[y][0];
	return mp(ans,fa[x][0]);
}
int query(int x,int y)
{
	pii getp=lca(x,y);
	int ans=-getp.fi+c[x-1]+c[y-1],td=getp.se;
	cout<<getp.fi<<' '<<getp.se<<' '<<c[x-1]<<' '<<c[y-1]<<' ';
	int val=fdp[td];
	int mh=dep[td]-dep[x];
	cout<<dep[td]<<' '<<dep[x]<<endl;
	for(int i=44;i>=0;i--)
	{
		cout<<i<<' '<<val<<' '<<mh<<' '<<((int)1<<i)<<endl;;
		if(mh>=(1<<i))
		{
			mh-=(1<<i);
			val=max(val,st[x][i]);
			x=fa[x][i];
		}
	}
	mh=dep[td]-dep[y];
	for(int i=44;i>=0;i--)
	{
		if(mh>=(1<<i))
		{
			mh-=(1<<i);
			val=max(val,st[y][i]);
			x=fa[y][i];
		}
	}
	cout<<val<<endl;
	return val+ans;
}
signed main()
{
	cin>>n>>q;
	for(int i=0;i<n;i++)
	{
		cin>>c[i];
	}
	for(int i=1;i<n;i++)
	{
		cin>>u>>vv>>w;
		v[u].push_back(mp(vv,w));
		v[vv].push_back(mp(u,w));
	}
	dfs(1,0);
	dfsdp(1,0);
	dfsfdp(1,0);
	mst();
	int x,y;
	for(int i=0;i<q;i++)
	{
		cin>>x>>y;
		cout<<query(x,y)<<endl;
	}
	for(int j=1;j<=n;j++)
	{
		cout<<dp[j]<<' ';
	}
	cout<<endl;
	for(int j=1;j<=n;j++)
	{
		cout<<fdp[j]<<' ';
	}
	cout<<endl;
	for(int i=0;i<45;i++)
	{
		for(int j=1;j<=n;j++)
		{
			cout<<st[j][i]<<' ';
		}
		cout<<endl;
	}
	return 0;
}
2024/11/25 15:26
加载中...