本题主要难点在于如何处理dist^2的问题

40分算法

n^2暴力就不必多嘴,直接枚举根节点DFS就行了。


70分算法

对于b=0的情况,我们可以考虑用换根法来计算根节点的变化对总权值带来的影响。

换根法一般的处理步骤是先以1为根处理出一些信息,然后根据这些信息再做一次DFS。

那这道题要维护哪些信息呢?

考虑换根时都有哪些变了:假设根节点从u变到v,显然,v及v的子树的贡献都会-dist(u,v)

,其他节点的贡献会+dist(u,v)。所以,总的权值变化就是dist(u,v)*(a[v子树外的点]-a[子树内的点])

随便搞搞就好

100分正解

对于b,我们可以如法炮制。对于一次换根(u->v):

对于v子树的点:设原距离为x,则贡献从bx2变为b*(x-dist(u,v))2

两式相减,可得变化量为b
(dist(u,v)2-2x*dist(u,v))。同理,子树外的点的变化量为b*(dist(u,v)2+2xdist(u,v))。

加到一起,总变化量就是sumb
dist(u,v)^2+2dist(u,v)(xb[v子树外的点]-x*b[子树内的点])。

维护下必要的信息就好。

#include<bits/stdc++.h>
using namespace std;
#define re register ll
#define F(x,y,z) for(re x=y;x<=z;x++)
#define FOR(x,y,z) for(re x=y;x>=z;x--)
#define I inline void
#define IN inline ll
typedef long long ll;
I read(ll &res){
re g=1;register char ch=getchar();res=0;
while(!isdigit(ch)){
if(ch=='-')g=-1;
ch=getchar();
}
while(isdigit(ch)){
res=(res<<3)+(res<<1)+(ch^48);
ch=getchar();
}
res*=g;
}
struct E{
int to,nt;
}e[606000];
#define T e[k].to
ll n,m,head[303000],S,ans,tot=-1,X,Y,suma,sumb,t[303000],siz[303000],a[303000],b[303000],f[303000],g[303000],A[303000],B[303000];
I D_1(ll x,ll fa){
A[x]=a[x];B[x]=b[x];f[x]=0;siz[x]=1;t[x]=0;
for(re k=head[x];k!=-1;k=e[k].nt){
if(T==fa)continue;
D_1(T,x);siz[x]+=siz[T];
A[x]+=A[T];B[x]+=B[T];f[x]+=f[T]+siz[T];t[x]+=(t[T]+B[T]);
}
}
I D_2(ll x,ll fa,ll sum,ll dis){
g[x]=sum;S+=(a[x]*dis)+(b[x]*dis*dis);
for(re k=head[x];k!=-1;k=e[k].nt){
if(T==fa)continue;
D_2(T,x,sum+n-siz[T]-siz[T],dis+1);
}
}
I D_3(ll x,ll fa,ll sum,ll num){
//cout<<"!"<<x<<" "<<sum<<" "<<num<<endl;
ans=max(ans,sum);
for(re k=head[x];k!=-1;k=e[k].nt){
if(T==fa)continue;
D_3(T,x,sum+suma-A[T]-A[T]+sumb+2ll*(num+(t[x]-t[T]-B[T]))-2ll*(t[T]+B[T]),num+t[x]-t[T]-B[T]+sumb-B[T]);
}
}
int main(){
//freopen("T1.in","r",stdin);
//freopen("T1.out","w",stdout);
read(n);
memset(head,-1,sizeof(head));
suma=sumb=0;
F(i,1,n){
read(a[i]);suma+=a[i];
}
F(i,1,n){
read(b[i]);sumb+=b[i];
}
F(i,1,n-1){
read(X);read(Y);
e[++tot].to=Y;
e[tot].nt=head[X];
head[X]=tot;
e[++tot].to=X;
e[tot].nt=head[Y];
head[Y]=tot;
}
D_1(1,0);
S=0ll;
D_2(1,0,f[1],0);
D_3(1,0,S,0);
//F(i,1,n){
//cout<<i<<":"<<f[i]<<" "<<g[i]<<" "<<A[i]<<" "<<B[i]<<" "<<t[i]<<endl;
//}
printf("%lld",ans);
return 0;
}

csp联考T1的更多相关文章

  1. 2017 [六省联考] T1 期末考试

    4868: [Shoi2017]期末考试 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 842  Solved: 385[Submit][Status ...

  2. 11.6八校联考T1,T2题解

    因为版权问题,不丢题面,不放代码了(出题人姓名也隐藏) T1 这,是一道,DP题,但是我最开始看的时候,我思路挂了,以为是一道简单题,然后就写错了 后来,我正确理解题意后写了个dfs,幸亏没有记忆化, ...

  3. 【五校联考1day2】JZOJ2020年8月12日提高组T1 对你的爱深不见底

    [五校联考1day2]JZOJ2020年8月12日提高组T1 对你的爱深不见底 题目 Description 出乎意料的是,幸运E 的小R 居然赢了那个游戏.现在欣喜万分的小R 想要写一张明信片给小Y ...

  4. [多校联考2019(Round 5 T1)] [ATCoder3912]Xor Tree(状压dp)

    [多校联考2019(Round 5)] [ATCoder3912]Xor Tree(状压dp) 题面 给出一棵n个点的树,每条边有边权v,每次操作选中两个点,将这两个点之间的路径上的边权全部异或某个值 ...

  5. CQOI2019(十二省联考)游记

    CQOI2019(十二省联考)游记 Day -? 自从联赛爆炸,\(THUWC\)爆炸,\(WC\)爆炸(就没有不爆炸的)之后我已经无所畏惧... 听说是考\(4.5 h\)吗? Day -1 \(Z ...

  6. 2019十二省联考 Round 1 && 济南市市中心游记

    在这样一场毒瘤的省选中 这道题目无疑是命题人无私的馈赠 大量精心构造的部分分,涵盖了题目中所有涉及的算法 你可以利用这道题目,对你是否能够进入省队进行初步检查 经典的模型.较低的难度和不大的代码量,能 ...

  7. 【BZOJ5498】[十二省联考2019]皮配(动态规划)

    [BZOJ5498][十二省联考2019]皮配(动态规划) 题面 BZOJ 洛谷 题解 先考虑暴力\(dp\),设\(f[i][j][k]\)表示前\(i\)所学校,有\(j\)人在某个阵营,有\(k ...

  8. 十二省联考 - JLOI2019 游记

    十二省联考 - JLOI 2019 游记 想了想,还是起一个副标题吧 一场失败的胜利 Day -inf 想了想,还是从头开始说吧. 其实考完NOIP之后,大概估算一下,吉林省队的数量还算是比较乐观的, ...

  9. AHOI(十二省联考)2019 退役记

    我也想退役失败.jpg Day 0 我才知道联考原来是4.5h? 下午居然还有讲题,感觉变得正规多了. 试机敲了LCT,NTT,SA,加起来花了大概40min,基本1A,感觉海星.键盘似乎有点过于灵敏 ...

随机推荐

  1. cookie插件|jq-cookie.js|使用详解

    1.设置一二级域名共用的cookie:设置domain为一级域名,可一.二级域名共用的cookie $.cookie('f_city','北京|101010100|,锦州|101070701|',{e ...

  2. [51 Nod 1584] 加权约数和

    题意 求∑i=1N∑j=1Nmax(i,j)⋅σ1(ij)\large \sum_{i=1}^N\sum_{j=1}^Nmax(i,j)\cdot\sigma_1(ij)i=1∑N​j=1∑N​max ...

  3. 数论--扩展欧几里得exgcd

    算法思想 我们想求得一组\(x,y\)使得 \(ax+by = \gcd(a,b)\) 根据 \(\gcd(a,b) = \gcd(b,a\bmod b)\) 如果我们现在有\(x',y'\) 使得 ...

  4. java 库存管理

     第一种方法: import java.util.Scanner; import java.util.Random; class kuCun { //库存管理 public static void m ...

  5. 又一款dump文件观察工具---MiniDumpView

    简介 MiniDumpView实用程序可用于显示minidump中数据流的内容.特别是,可以显示以下信息: 操作系统和CPU信息 进程信息(进程ID和时间) 模块列表(包含每个模块的详细信息) 线程列 ...

  6. c博客作业01--顺序分支结构

    0.展示PTA总分 1.本章学习总结 1.1 学习内容总结 1.运算符需注意的要点 '/'的左右两边如果均为整型数,其结果也为整型:'%'的左右两边只能为整型数: 优先级:逻辑运算符<关系运算符 ...

  7. 廖雪峰Python笔记

    △命令行模式和Python交互模式 在Windows开始菜单选择“命令提示符”,就进入到命令行模式,它的提示符类似C:\>:在命令行模式下敲命令python,就看到类似如下的一堆文本输出,然后就 ...

  8. ajax post data 获取不到数据,注意 content-type的设置 、post/get(转)

    ajax post  data  获取不到数据,注意 content-type的设置 .post/get 关于 jQuery data 传递数据.网上各种获取不到数据,乱码之类的. 好吧今天我也遇到了 ...

  9. python学习笔记二:(python3 logging函数中format说明)

    背景,在学习logging时总是遇到无法理解的问题,总结,尝试一下更清晰明了了,让我们开始吧! logging模块常用format格式说明 %(levelno)s: 打印日志级别的数值 %(level ...

  10. idea在使用git clone 时出现Filename too long

    idea在使用git clone 时出现Filename too long的报错信息,使用如下命令就可以解决该问题:在 git bash命令模式下,运行命令 git config --global c ...