本文同步发布于我的网站

Problem

给一棵根为 1 的有根树,点 \(i\) 具有一个权值 \(A_i\) 。

定义一个点对的值 \(f(u, v)=\max \left(A_u, A_v\right) \times\left|A_u-A_v\right|\) 。

你需要对于每个节点 \(i\) ,计算 \(a n s_i=\sum_{u \in \operatorname{subtree}(i), v \in \operatorname{subtree}(i)} f(u, v)\) ,其中 \(\operatorname{subtree}(i)\) 表示 \(i\) 的子树。

请你输出 \(\oplus\left(a n s_i \bmod 2^{64}\right)\) ,其中 \(\oplus\) 表示 XOR。

\(n \leq 5 \times 10^5, 1 \leq A_i \leq 10^6\)

Solution

先来愉快的推式子。

其实 \(\max \left(A_u, A_v\right) \times\left|A_u-A_v\right|\) 其实就是 \(\max^2-\max \cdot \min\),这两部分可以分开思考。

对于 \(\max\cdot\min\),其实就是在 \(i\) 的子树内任选两个点 \(u,v\in \operatorname{subtree}(i)\) 相乘

\[\begin{align}
&\sum_{u} \sum_{v } A_u\times A_v\\
=&\sum_{u }A_u\sum_{v}A_v\\
=&(\sum_{u}A_u)^2
\end{align}
\]

对于 \(\max ^2\),也就是 \(\sum_{u,v\in \operatorname{subtree}(i)}(\max(A_u,A_v))^2\),我们需要思考子树合并的情况。

假设我们已经计算了节点 \(u\) 的所有子节点的子树的内部信息,\(v\) 是 \(u\) 的某个儿子,此时我们需要计算

  • \(u\) 与 \(\operatorname{subtree}(v)\) 之间的贡献
  • \(\operatorname{subtree}(v_i)\) 与 \(\operatorname{subtree}(v_j)\) 之间的贡献(即跨点 \(u\) 的两点之间的贡献)

我们按照以下方式合并的同时计算贡献(以下步骤来自于题解)

  • \(\operatorname{subtree}(u)\) 初始为 \(\{u\}\) 。
  • 计算 \(\operatorname{subtree}(v)\) 和当前 \(\operatorname{subtree}(u)\) 之间点对的答案。(跨越 \(u\) 节点的部分)。
  • 把 \(\operatorname{subtree}(v)\) 子树内的答案直接累加。(不跨越 \(u\) 节点的部分)。
  • \(\operatorname{subtree}(u) \leftarrow \operatorname{subtree}(u)+\operatorname{subtree}(v)\) (将 \(v\) 的子树加入到 \(u\) 中)。

我们需要维护两个变量:一个子树内的权值出现次数 \(cnt\) 与权值平方和 \(sum\)。

当前子树 \(\operatorname{subtree}(u)\) 内加入一个权重为 \(w\) 的点,对于答案贡献多少呢?

  • 对于 \(\operatorname{subtree}(u)\) 中每个权值小于 \(w\) 的点,贡献 \(1\times w^2\),总计 \(2\times\sum_{i=1}^{w-1} cnt_i\times w^2\)。

  • 对于 \(\operatorname{subtree}(u)\) 中每个权值大于等于 \(w\) 的点(权重为 \(w^\prime\)),贡献 \(1\times {w^\prime}^2\),总计 \(2\times\sum_{i=w}^{10^6}sum_i\)

对于每个节点,我们开一颗线段树。初始时,每个节点的线段树只包含其本身点权。计算完某个点所有儿子的 \(ans\) 之后,我们将所有儿子的线段树合并到其自己上,同时计算贡献。

Code

#define N 500010
#define M 1000000
ULL a[N];
int n; namespace Tree
{
int head[N],nxt[N*2],ver[N*2],f[N];
int cnt;
void insert(int x,int y)
{
nxt[++cnt]=head[x];
head[x]=cnt;
ver[cnt]=y;
} }; using Tree::insert;
using Tree::head;
using Tree::nxt;
using Tree::ver; namespace Seg
{
struct Node
{
int ls,rs,l,r;
ULL sum,cnt;
#define ls(x) a[x].ls
#define rs(x) a[x].rs
#define l(x) a[x].l
#define r(x) a[x].r
#define sum(x) a[x].sum
#define cnt(x) a[x].cnt
}a[N*40];
int cnt;
int root[N];
int new_node(int l,int r)
{
cnt++;
l(cnt)=l;
r(cnt)=r;
return cnt;
} void add(int &p,int x)
{
debug
if(p==0) p=new_node(1,M);
if(l(p)==r(p))
{
debug
sum(p)+=(ULL)(x)*x;
cnt(p)++;
return;
}
int mid=(l(p)+r(p))/2;
if(x<=mid)
{
if(!ls(p)) ls(p)=new_node(l(p),mid);
add(ls(p),x);
}
else
{
if(!rs(p)) rs(p)=new_node(mid+1,r(p));
add(rs(p),x);
}
cnt(p)=cnt(ls(p))+cnt(rs(p));
sum(p)=sum(ls(p))+sum(rs(p));
} int merge(int x,int y,ULL &ans)
{
if(!x) return y;
if(!y) return x;
if(l(x)==r(x))
{
ans+=2*cnt(x)*sum(y);
sum(x)+=sum(y);
cnt(x)+=cnt(y);
return x;
} sum(x)+=sum(y);
cnt(x)+=cnt(y); ans+=2*cnt(ls(x))*sum(rs(y));
ans+=2*cnt(ls(y))*sum(rs(x)); ls(x)=merge(ls(x),ls(y),ans);
rs(x)=merge(rs(x),rs(y),ans); return x;
} }; using Seg::add;
using Seg::merge;
using Seg::root; ULL sq[N],ans[N],sum[N]; void dfs(int x,int f)
{
sum[x]=a[x];
sq[x]=a[x]*a[x];
add(root[x],a[x]);
for(int i=head[x];i;i=nxt[i])
{
int y=ver[i];
if(y==f) continue;
dfs(y,x);
sum[x]+=sum[y];
sq[x]+=sq[y];
root[x]=merge(root[x],root[y],sq[x]);
}
ans[x]=sq[x]-sum[x]*sum[x];
} int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cout.precision(10);
int t=1;
// cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<n;i++)
{
int x,y;
cin>>x>>y;
Tree::insert(x,y);
Tree::insert(y,x);
}
for(int i=1;i<=n;i++)
{
cin>>a[i];
} dfs(1,0); ULL out=0;
for(int i=1;i<=n;i++)
{
out^=ans[i];
// cout<<ans[i]<<" ";
}
cout<<out<<endl; }
return 0;
}

2024杭电钉耙1-1003 HDOJ7435 树的更多相关文章

  1. 杭电 HDU ACM 2795 Billboard(线段树伪装版)

    Billboard Time Limit: 20000/8000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  2. 可持久化线段树的学习(区间第k大和查询历史版本的数据)(杭电多校赛第二场1011)

    以前我们学习了线段树可以知道,线段树的每一个节点都储存的是一段区间,所以线段树可以做简单的区间查询,更改等简单的操作. 而后面再做有些题目,就可能会碰到一种回退的操作.这里的回退是指回到未做各种操作之 ...

  3. 杭电ACM题单

    杭电acm题目分类版本1 1002 简单的大数 1003 DP经典问题,最大连续子段和 1004 简单题 1005 找规律(循环点) 1006 感觉有点BT的题,我到现在还没过 1007 经典问题,最 ...

  4. 杭电ACM分类

    杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze ...

  5. 杭电acm习题分类

    专注于C语言编程 C Programming Practice Problems (Programming Challenges) 杭电ACM题目分类 基础题:1000.1001.1004.1005. ...

  6. 杭电 1272 POJ 1308 小希的迷宫

    这道题是我学了并查集过后做的第三个题,教我们的学姐说这是并查集的基础题,所以有必要牢牢掌握. 下面就我做这道题的经验,给大家一些建议吧!当然,我的建议不是最好的,还请各位大神指出我的错误来,我也好改正 ...

  7. 杭电acm阶段之理工大版

    想參加全国软件设计大赛C/C++语言组的同学,假设前一篇<C和指针课后练习题总结>没看完的,请先看完而且依照上面的训练做完,然后做以下的训练. 传送门:http://blog.csdn.n ...

  8. 2018 Multi-University Training Contest 1 杭电多校第一场

    抱着可能杭电的多校1比牛客的多校1更恐怖的想法 看到三道签到题 幸福的都快哭出来了好吗 1001  Maximum Multiple(hdoj 6298) 链接:http://acm.hdu.edu. ...

  9. 2017杭电ACM集训队单人排位赛 - 6

    2017杭电ACM集训队单人排位赛 - 6 排名 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 59 1 X X 1 1 X X 0 1 ...

  10. acm入门 杭电1001题 有关溢出的考虑

    最近在尝试做acm试题,刚刚是1001题就把我困住了,这是题目: Problem Description In this problem, your task is to calculate SUM( ...

随机推荐

  1. Windows 提权-PrintNightmare

    本文通过 Google 翻译 PrintNightmare – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充 ...

  2. nginx启动失败 Starting nginx nginx [fail]

    nginx -t :测试配置文件是否有语法错误 看看报什么错误,我的是忘记给权限了 nginx: [alert] could not open error log file: open() " ...

  3. 从 PostgreSQL 升级至 IvorySQL 4.0

    本文作者:严少安,IvorySQL 贡献者. 本文为授权转载. 2024 年 8 月,我在<PG 12 即将退役,建议升级到 16.4>一文中提到,PostgreSQL 12 版本即将&q ...

  4. 再谈MCP协议,看看 MCP 是如何重塑 AI 与外部数据源互动的能力?

    Techscribe Central 缩略图由 Techscribe Central 制作和编辑 MCP!!是不是一头雾水?我当时也是这个反应.我也是最近才听说它开始引发关注,然后我发现大多数人根本不 ...

  5. 【Git】在 Idea 中使用 Git

    在 Idea 中使用 Git 1 安装 Git 核心程序 根据自己的电脑操作系统从 Git 官网 https://git-scm.com/ 下载对应的 Git 核心程序. 以 git-2.21.0 为 ...

  6. ASP.NET Core 阿弥陀佛中间件

    Amitabha n. <梵>(佛)阿弥陀佛 佛曰: 因果 那么一天 看见文章1. 发现还有2.这么个中间件 于是追寻源码,发现了3. 再然后寻思自己也可以写一个什么中间件,以便学习掌握 ...

  7. Web前端入门第 31 问:CSS background 元素背景图用法全解

    background 可设置背景色.渐变.背景图等,本文主要讲解背景图片的用法. 背景顾名思义就是背后的景色,始终居于元素背后,元素永远站在背景的身前. 本文示例中所使用的图片: background ...

  8. unity 多层叠加的BillBoard特效转序列帧特效降低overdraw

  9. php 微信小程序转义403

    function code 微信 iv 偶现 encryptedData 41003 encodeURIComponent 关于小程序微信授权登录提示41003 文章简介 原因一(iv和encrypt ...

  10. C# 线程(一)——基础概念(线程与进程、前后台线程)

    一.基础概念 1.1线程与进程 线程--是一个可执行路径,它可以独立于其他线程执行. 进程--每个线程都在操作系统的进程(Process)内执行,而操作系统则提供了程序运行的独立环境,它提供了一个应用 ...