记录编号 545761 评测结果 AAAAAAAAAAATTTTTTETETEETT
题目名称 [NOIP 2018]保卫王国 最终得分 44
用户昵称 GravatarHale 是否通过 未通过
代码语言 C++ 运行时间 22.880 s
提交时间 2019-11-01 18:33:42 内存使用 16.91 MiB
显示代码纯文本
#include<bits/stdc++.h>
#define I inline
#define LL long long
using namespace std;
const int N=1e5+7;
const int INF=2147483647;
int m,n,k,p[N];
int Q,head[N],cnt;
LL dp[N][2];
struct edge
{
	int nx,to;
} e[N];
void add_edge(int a,int b)
{
	cnt++;e[cnt].nx=head[a];e[cnt].to=b;head[a]=cnt;
}
bool limit[N],used[N];
I int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
void dfs(int x,int fa)
{
	dp[x][1]+=p[x];
	for (int i=head[x];i;i=e[i].nx)
	{
		int y=e[i].to;
		if (y==fa) continue;
		dfs(y,x);
		dp[x][1]+=min(dp[y][0],dp[y][1]);
		dp[x][0]+=dp[y][1];
	}
}
int main()
{
	freopen("2018defense.in","r",stdin);
	freopen("2018defense.out","w",stdout);
	//freopen("xx.in","r",stdin);
	n=read(),Q=read();string s1;cin>>s1;
	for (int i=1;i<=n;i++) p[i]=read();
	for (int i=1;i<n;i++)
	{
		int x=read(),y=read();
		add_edge(x,y);add_edge(y,x);
	}
	while (Q--)
	{
		int x=read(),a=read(),y=read(),b=read();
		memset(dp,0,sizeof(dp));
		dp[x][1-a]=INF;dp[y][1-b]=INF;
		dfs(1,-1);
		if (min(dp[1][0],dp[1][1])>=INF) printf("-1\n");
		else printf("%lld\n",min(dp[1][0],dp[1][1]));
	}
	return 0;
}