WA 68 求调
查看原帖
WA 68 求调
542879
_HCl_楼主2023/4/25 13:31

WA #3#4#7#10#11#23#24#25 谢谢

#include<bits/stdc++.h>
#define int long long
#define INF 1000000000000000001
using namespace std;
int n,m,p[100001];
vector<int> e[100001];
void read() {
	string str;
	cin>>n>>m>>str;
	for(int i=1; i<=n; ++i) {
		cin>>p[i];
	}
	for(int i=1; i<=n-1; ++i) {
		int u,v;
		cin>>u>>v;
		e[u].push_back(v);
		e[v].push_back(u);
	}
}
int f[100001][2],g[100001][2],an[100001][22],h[100001][22][2][2],dep[100001];
void dfs1(int x,int fa) {
	dep[x]=dep[fa]+1;
	f[x][0]=0,f[x][1]=p[x];
	for(int i=0; i<e[x].size(); ++i) {
		int y=e[x][i];
		if(y==fa)continue;
		dfs1(y,x);
		f[x][0]+=f[y][1],f[x][1]+=min(f[y][0],f[y][1]);
	}
}
void dfs2(int x,int fa) {
	for(int i=0; i<e[x].size(); ++i) {
		int y=e[x][i];
		if(y==fa)continue;
		an[y][0]=x;
		g[y][0]=g[x][1]+f[x][1]-min(f[y][0],f[y][1]);
		g[y][1]=min(g[x][0]+f[x][0]-f[y][1],g[y][0]);
		dfs2(y,x);
	}
}
void dp() {
	for(int i=1; i<=n; ++i) {
		h[i][0][0][0]=INF;
		h[i][0][0][1]=f[an[i][0]][1]-min(f[i][0],f[i][1]);
		h[i][0][1][0]=f[an[i][0]][0]-f[i][1];
		h[i][0][1][1]=f[an[i][0]][1]-min(f[i][0],f[i][1]);
	}
	for(int j=1; j<=21; ++j) {
		for(int i=1; i<=n; ++i) {
			an[i][j]=an[an[i][j-1]][j-1];
			for(int k1=0; k1<=1; ++k1) {
				for(int k2=0; k2<=1; ++k2) {
					h[i][j][k1][k2]=INF;
					for(int k3=0; k3<=1; ++k3) {
						h[i][j][k1][k2]=min(h[i][j][k1][k2],h[i][j-1][k1][k3]+h[an[i][j-1]][j-1][k3][k2]);
					}
				}
			}
		}
	}
}
int calc(int a,int x,int b,int y) {
	if(dep[a]>dep[b])swap(a,b),swap(x,y);
	int ta[2]= {INF,INF},tb[2]= {INF,INF};
	ta[x]=f[a][x],tb[y]=f[b][y];
	for(int i=21; i>=0; --i) {
		if(dep[an[b][i]]>=dep[a]) {
			int bx[2]= {INF,INF};
			for(int j=0; j<=1; ++j) {
				for(int k=0; k<=1; ++k) {
					bx[j]=min(bx[j],tb[k]+h[b][i][k][j]);
				}
			}
			b=an[b][i];
			tb[0]=bx[0],tb[1]=bx[1];
		}
	}
	if(a==b) {
		return tb[x]+g[a][x];
	}
	for(int i=21; i>=0; --i) {
		if(an[b][i]!=an[a][i]) {
			int ax[2]= {INF,INF},bx[2]= {INF,INF};
			for(int j=0; j<=1; ++j) {
				for(int k=0; k<=1; ++k) {
					ax[j]=min(ax[j],ta[k]+h[a][i][k][j]);
					bx[j]=min(bx[j],tb[k]+h[b][i][k][j]);
				}
			}
			a=an[a][i],b=an[b][i];
			tb[0]=bx[0],tb[1]=bx[1],ta[0]=ax[0],ta[1]=ax[1];
		}
	}
	int lca=an[b][0];
	int ans0=f[lca][0]+g[lca][0]+ta[1]+tb[1]-f[a][1]-f[b][1];
	int ans1=f[lca][0]+g[lca][0]+min(ta[0],ta[1])+min(tb[0],tb[1])-min(f[a][0],f[a][1])-min(f[b][0],f[b][1]);
	return min(ans0,ans1);
}
void answer() {
	for(int i=1; i<=m; ++i) {
		int a,b,x,y;
		cin>>a>>x>>b>>y;
		int ans=calc(a,x,b,y);
		cout<<(ans>=INF?-1:ans)<<"\n";
	}
}
signed main() {
	read();
	dfs1(1,0);
	dfs2(1,0);
	dp();
	answer();
}
2023/4/25 13:31
加载中...