当前位置: 首页 > news >正文

2024杭电多校01——1003树

补题链接
在这里插入图片描述
官方题解
在这里插入图片描述
补充:
( ∑ u ∈ t r e e i a u ) 2 (\sum_{u \in tree_i} a_u)^2 (utreeiau)2 = ∑ u ∈ t r e e i a u 2 + 2 ∑ x ∈ t r e e i , y ∈ t r e e i a x ∗ a y = \sum_{u \in tree_i} a_u^{2}+2\sum_{x \in tree_i,y \in tree_i} a_x*a_y =utreeiau2+2xtreei,ytreeiaxay
可以用树状数组算出 ∑ a u 2 \sum a_u^{2} au2 ∑ a u \sum a_u au,这样通过上述式子就可以求出 ∑ a x ∗ a y \sum a_x*a_y axay即原文中的第二行

蒟蒻不太理解后面说的话,只能讲点自己会的,对于一个集合和一个加入的点,会有大于集合元素的贡献和小于集合元素的贡献(贡献就是f(u,v)要我们求和的东西),如何快速求出贡献,可以用三个树状数组去维护,t1代表小于等于x的元素个数,tx代表所有元素的和,txx代表大于x的元素平方和

每次合并答案的时候, ∑ f ( u , v ) = ∑ a [ u ] ≤ a [ x ] f ( x , u ) + ∑ a [ x ] ≤ a [ v f ( x , v ) \sum f(u,v) = \sum_{a[u] \leq a[x]} f(x,u) +\sum_{a[x] \leq a[v} f(x,v) f(u,v)=a[u]a[x]f(x,u)+a[x]a[vf(x,v)小于等于x的元素个数存储在t1里,大于x的元素的平方和存储在txx里,要减去的部分全在tx里,这样就可以跑树上启发式合并了

#include<bits/stdc++.h>
using namespace std;
using i64 = unsigned long long;
using i128 = __int128;
#define ios ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define int unsigned long long
const int maxn = 1e6+10;
int n,a[maxn];
vector<int>g[maxn];int son[maxn],siz[maxn],HH;
int f[maxn],ff[maxn],l[maxn],r[maxn],idx=1;void dfs(int x,int fa){siz[x]=1;f[x]=idx;ff[idx] = x;l[x]=idx++;for(auto y:g[x]){if(y==fa) continue;dfs(y,x);siz[x]+=siz[y];if(siz[son[x]]<siz[y]) son[x] = y;}r[x] = idx-1;
}struct bit{i64 tree[maxn];inline int lowbit(int x){return x&(-x);}inline void update(int x,i64 v){for(int i = x;i<maxn;i+=lowbit(i)){tree[i]+=v;}}inline i64 query(int x){i64 res = 0;for(int i = x;i>0;i-=lowbit(i)){res+=tree[i];}return res;}
}t1,tx,txx;i64 add(i64 x){return x*x*t1.query(x)-x*tx.query(maxn-10)+txx.query(maxn-10)-txx.query(max(x,0uLL));
}vector<i64> tmp;
void upd(i64 x){t1.update(x,1uLL);tx.update(x,x);txx.update(x,x*x);tmp.push_back(x);
}void clear(){for(auto x:tmp){t1.update(x,-1);tx.update(x,-1uLL*x);txx.update(x,-1uLL*x*x);}vector<i64>().swap(tmp);//清空tmp省内存
}i64 ans[maxn];
void dsu(int x,int fa,bool op){for(auto y:g[x]){if(y==fa||y==son[x]) continue;dsu(y,x,0);}if(son[x]) dsu(son[x],x,1),HH = son[x],ans[x] = ans[son[x]];for(auto y:g[x]){if(y==fa||y==HH) continue;ans[x]+=ans[y];for(int i = l[y];i<=r[y];++i){ans[x]+=2uLL*add(a[ff[i]]);}for(int i = l[y];i<=r[y];++i){upd(a[ff[i]]);}}ans[x]+=2uLL*add(a[x]);HH=0;if(!op) clear();else upd(a[x]);
}signed main(){ios;cin>>n;for(int i = 1;i<n;++i){int x,y;cin>>x>>y;g[x].push_back(y);g[y].push_back(x);}for(int i = 1;i<=n;++i) cin>>a[i];dfs(1,0);dsu(1,0,1);i64 res = 0;for(int i = 1;i<=n;++i) res=(res^ans[i]);cout<<res<<"\n";return 0;
}

杭电多校的题解好少啊,官方题解又看不懂QAQ。
有没有大佬有不求dfs序的写法,之前的模版都是不用求dfs序的,现在求dfs序感觉怪怪的,对dfs不是很熟悉感觉

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • SpringBoot Mysql->达梦8 activiti6.0.0 项目迁移
  • JLink烧录失败
  • 免费发送邮件两种接口方式:SMTP和邮件API
  • “链动+消费增值:用户留存复购新引擎“
  • CSS3 scale 适配
  • zeppline 连接flink 1.17报错
  • WordPress 后台开发技巧:向文章发布页右侧添加自定义菜单项
  • react中的useState和Hook、副作用
  • 小白也能轻松学的计算机网络零基础入门(附学习路线 + 计算机网络教程)
  • CSS实现图片边框酷炫效果
  • PHP时间相关函数
  • 过滤和筛选树形结构数据
  • 关于Redis持久化和集群模式(主从,哨兵,去中心化)使用和介绍
  • Spring Boot 缓存支持及其优缺点
  • Linux中安装C#的.net,创建运行后端或控制台项目
  • 时间复杂度分析经典问题——最大子序列和
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • canvas 高仿 Apple Watch 表盘
  •  D - 粉碎叛乱F - 其他起义
  • Facebook AccountKit 接入的坑点
  • HTML5新特性总结
  • js学习笔记
  • Mybatis初体验
  • Python连接Oracle
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • Vue全家桶实现一个Web App
  • Vue小说阅读器(仿追书神器)
  • 给初学者:JavaScript 中数组操作注意点
  • 观察者模式实现非直接耦合
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 突破自己的技术思维
  • 我感觉这是史上最牛的防sql注入方法类
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 学习笔记:对象,原型和继承(1)
  • 赢得Docker挑战最佳实践
  • 组复制官方翻译九、Group Replication Technical Details
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #pragma multi_compile #pragma shader_feature
  • (~_~)
  • (6)设计一个TimeMap
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (LeetCode C++)盛最多水的容器
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (层次遍历)104. 二叉树的最大深度
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (蓝桥杯每日一题)love
  • (面试必看!)锁策略
  • (三)Honghu Cloud云架构一定时调度平台
  • (一)u-boot-nand.bin的下载
  • (转)Scala的“=”符号简介
  • (转)Windows2003安全设置/维护
  • (转)四层和七层负载均衡的区别