为什么锣鼓过了,梦熊RE

#include<bits/stdc++.h>
#define int long long
using namespace std;
int read() {
	int x=0, w=1; char ch=getchar();
	while(!isdigit(ch)) {if(ch=='-') w=-1; ch=getchar();}
	while(isdigit(ch)) {x=x*10+(ch-'0'); ch=getchar();}
	return x*w;
}
const int N=2e6+10;
const int inf=0x3f3f3f3f;
int n, q, f[N];
struct edge {int y, c;} ; 
vector<edge> g[N];
int tsp, rk[N];
struct node {int c, fa, dep, siz, dis, son, top, dfn;} t[N];
void dfs1(int x, int fa) {
	t[x].fa=fa; t[x].dep=t[fa].dep+1; 
	t[x].siz=1; f[x]=t[x].c;
	for(auto tp:g[x]) {
		int y=tp.y, c=tp.c;
		if(y==fa) continue;
		t[y].dis=t[x].dis+c;
		dfs1(y, x);
		f[x]=max(f[x], f[y]-2*c); t[x].siz+=t[y].siz;
		if(t[y].siz>t[t[x].son].siz) t[x].son=y;
	}
}
void dfs2(int x, int top) {
	t[x].dfn=++tsp; t[x].top=top; rk[tsp]=x;
	if(!t[x].son) return ;
	dfs2(t[x].son, top);
	for(auto tp:g[x]) {
		int y=tp.y;
		if(y==t[x].fa||y==t[x].son) continue;
		dfs2(y, y);
	}
}
void dfs(int x) {
	for(auto tp:g[x]) {
		int y=tp.y, c=tp.c;
		if(y==t[x].fa) continue;
		f[y]=max(f[y], f[x]-2*c);
		dfs(y);
	}
}
int st[N][30], lg[N];
void init() {
	lg[0]=-1;
	for(int i=1;i<=n;i++) lg[i]=lg[i>>1]+1;
	for(int i=1;i<=n;i++) st[t[i].dfn][0]=f[i];
	for(int j=1;j<=20;j++) {
		for(int i=1;i<=n-(1<<j)+1;i++) 
			st[i][j]=max(st[i][j-1], st[i+(1<<j-1)][j-1]);
	}
}
int query(int l, int r) {
	int s=lg[r-l+1];
	return max(st[l][s], st[r-(1<<s)+1][s]);
}
signed main() {
	n=read(), q=read();
	for(int i=1;i<=n;i++) t[i].c=read();
	for(int i=1,x,y,c;i<n;i++) {
		x=read(), y=read(), c=read();
		g[x].push_back({y, c});
		g[y].push_back({x, c});
	}
	dfs1(1, 0); dfs2(1, 1); dfs(1);
	init();
	while(q--) {
		int st=read(), ed=read();
		int x=st, y=ed, res=-inf;
		while(t[x].top!=t[y].top) {
			if(t[t[x].top].dep<t[t[y].top].dep) swap(x, y);
			res=max(res, query(t[t[x].top].dfn, t[x].dfn));
			x=t[t[x].top].fa;
		}
		if(t[x].dep>t[y].dep) swap(x, y);
		res=max(res, query(t[x].dfn, t[y].dfn));
		printf("%lld\n", t[st].c+t[ed].c-(t[st].dis+t[ed].dis-2*t[x].dis)+res);
	}
	return 0;
}

1 条评论

  • @ 2024-12-24 10:22:12

    把 2e6 改成 2e5

    • 1

    信息

    ID
    98
    时间
    1000ms
    内存
    256MiB
    难度
    5
    标签
    递交数
    614
    已通过
    159
    上传者