nodejs做网站的弊端,淘宝怎么优化关键词排名,江苏建设类高级工程师在那个网站公示,书签制作古风正题
题目链接:https://jzoj.net/senior/#main/show/3844 题目大意
一棵树#xff0c;求每条路径的点权乘积之和。 解题思路
若只考虑从xxx出发往子树的路径#xff0c;那么有fxaxax∗∑x−yfyf_xa_xa_x*\sum_{x-y}f_yfxaxax∗x−y∑fy
定义gig_ig…正题
题目链接:https://jzoj.net/senior/#main/show/3844 题目大意
一棵树求每条路径的点权乘积之和。 解题思路
若只考虑从xxx出发往子树的路径那么有fxaxax∗∑x−yfyf_xa_xa_x*\sum_{x-y}f_yfxaxax∗x−y∑fy
定义gig_igi为从iii开始的路径乘积和
但是要考虑往上又往下的我们考虑换根法那么我们对于每个ax∗∑x−yfya_x*\sum_{x-y}f_yax∗∑x−yfy相当于要求出父节点的fyf_yfy其实就是gfa−fx∗axg_{fa}-f_x*a_xgfa−fx∗ax。但是这样我们求出来的答案会有重复我们考虑从父节点的ffaf_{fa}ffa入手我们只要让新枚举到的数传下去的fxf_xfx是之前累计的减去即可。 codecodecode
#includecstdio
#includecstring
#includealgorithm
using namespace std;
const int XJQ10086,N110000;
struct node{int to,next;
}a[N*2];
int n,w[N],ls[N],tot,f[N],g[N],ans;
void addl(int x,int y)
{a[tot].toy;a[tot].nextls[x];ls[x]tot;
}
void dp(int x,int fa)
{for(int ils[x];i;ia[i].next){int ya[i].to;if(yfa) continue;dp(y,x);f[x](f[x]f[y])%XJQ;}f[x](f[x]*w[x]%XJQw[x])%XJQ;
}
void cr(int x,int fa,int z)
{if(x!1)g[x](f[x]z*w[x]%XJQ)%XJQ;int sumw[x];for(int ils[x];i;ia[i].next){int ya[i].to;if(yfa) continue;sum(sumf[y]*w[x]%XJQ)%XJQ;cr(y,x,(g[x]-sumXJQ)%XJQ);}ans(ansg[x])%XJQ;
}
int main()
{scanf(%d,n);for(int i1;in;i)scanf(%d,w[i]),w[i]%XJQ;for(int i1;in;i){int x,y;scanf(%d%d,x,y);addl(x,y);addl(y,x);}dp(1,1);g[1]f[1];cr(1,1,1);printf(%d,ans);
}