2024杭电多校01——1003树

news2024/11/15 17:40:37

补题链接
在这里插入图片描述
官方题解
在这里插入图片描述
补充:
( ∑ 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不是很熟悉感觉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1963872.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Prompt——3分钟掌握,润色论文的7条经典指令。帮助很大,一定要看!

这是一篇帮助你润色论文的ChatGPT指令合集&#xff0c;整理了润色过程中语法优化、审阅校对、专业风格等7个主要方面。 建议收藏&#xff0c;需要的时候直接CtrlV即可&#xff0c;一定对你科研有所帮助~ 1. 修复语法和句法 第一个提示是修复语法和句法。这是任何写作的关键部…

vue页面左右箭头手动切换中间app列表

1 效果: 2 HTML代码分析: HTML代码: <div class"all_app"><div class"app-container"><el-button icon"el-icon-arrow-left" circle click"switchList(left)"></el-button><div class"middle-list&q…

【包邮送书】码农职场:IT人求职就业手册

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

HarmonyOS APP应用开发项目- MCA助手(Day04持续更新中~)

简言&#xff1a; gitee地址&#xff1a;https://gitee.com/whltaoin_admin/money-controller-app.git端云一体化开发在线文档&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/agc-harmonyos-clouddev-view-0000001700053733-V5注&#xff1a;…

Educational Codeforces Round 168 (Rated for Div. 2)(A~D题题解)

A. Strong Password 思路&#xff1a;想要最长的时间&#xff0c;那么肯定就是如果存在前后相同的字母的时候&#xff0c;在中间插入一个不同的字符 &#xff0c;如果不存在前后相同的字符&#xff0c;直接在最后插入一个和原字符串最后一个字符不同的字符 #include <bits/…

等保学习干货|等保测评2.0技术中间件自查阶段,零基础入门到精通,收藏这一篇就够了

0x01 前言 以下是根据我国网络安全体系制订的一系列保护流程进行的等级保护测评。该测评针对已有和将上线的业务服务的基础设施&#xff08;系统、数据库、中间件等&#xff09;&#xff0c;执行一系列检查以确保安全合规。本次先行分享学习等保中的技术自查阶段知识&#xff…

ubuntu24.04 LTS安装BackupPC备份软件

一、安装BackupPC 默认情况下&#xff0c;BackupPC 在 ubuntu24.04 LTS 默认存储库中可用。您只需运行以下命令即可安装它&#xff1a; apt-get install backuppc -y在安装过程中&#xff0c;您将被要求选择邮件配置的类型&#xff0c;如下所示&#xff1a; 选择仅限本地&…

在 VueJS 中使用 Keep-Alive 处理窗口调整事件(在使用keep-alive缓存组件时,处理多个vue页面的resize事件)

前言 我们在使用 VueJS 开发复杂的单页应用程序时&#xff0c;我们经常需要管理组件的生命周期事件&#xff0c;以确保它们在特定的条件下正常工作。例如&#xff0c;当窗口大小调整时&#xff0c;我们可能需要重新绘制某些组件。这里我们详细介绍一下&#xff0c;如何在使用 …

安装docker-东方通tongRDS

首先&#xff0c;确保你的系统已经安装了Docker。你可以在终端中运行以下命令来检查Docker是否已经安装&#xff1a; docker --version接下来&#xff0c;你需要从Docker hub上拉取东方通tongRDS的镜像。在终端中运行以下命令&#xff1a; docker pull dongfangtongrds/tongr…

Unity Camera

课程目标 1. 了解摄像机&#xff08;camera&#xff09;不同视角的设计与实现&#xff1b;2. 感受在不同摄像机视角下观察虚拟场景。 喜欢玩游戏或者看3D动漫的朋友可以回忆在虚拟场景中摄像头的运动变化带来的视觉感受&#xff0c;例如&#xff1a;摄像头给场景中的主角来个…

创客项目秀|基于XIAO SAMD21的多功能笔筒

作者&#xff1a;Arnov Sharma 来自&#xff1a;MIT 发表日期&#xff1a; 2024年6月17日 这个多功能笔筒项目是使用3D打印零件进行搭建的&#xff0c;在笔筒的前端添加了XIAO扩展板&#xff0c;给这个笔筒添加一个显示器&#xff0c;可以在显示器上显示许多内容&#xff0c…

【Devops】CertD 完全免费、自动申请、自动部署SSL证书一站式管理工具 | 自动化HTTPS | 3个月SSL自动轮换

CertD CertD 是一个免费全自动申请和自动部署更新SSL证书的工具。 后缀D取自linux守护进程的命名风格&#xff0c;意为证书守护进程。 关键字&#xff1a;证书自动申请、证书自动更新、证书自动续期、证书自动续签 一、特性 本项目不仅支持证书申请过程自动化&#xff0c;还…

P2048 [NOI2010] 超级钢琴(纪念紫题)

原题 题面 具体实现讲解 首先想到用 s u m sum sum记录 a a a数组的前缀和&#xff0c;把每种和弦都试一遍&#xff0c;很明显会超时。 定义 c a l ( s , l , r ) cal(s,l,r) cal(s,l,r)代表以 s s s为左端点&#xff0c;右端点在 l l l到 r r r的范围内&#xff0c;能得到的…

css:grid的使用(部分)

一&#xff1a;grid的使用&#xff08; 平分宽度 &#xff09; <template><view class""><view class"main"><view class"main-item">1</view><view class"main-item">2</view><view cl…

Can ‘t connect to local MySQL server through socket ‘/tmp/mysql.sock ‘(2) “;

Can t connect to local MySQL server through socket /tmp/mysql.sock (2) "; 目录 Can t connect to local MySQL server through socket /tmp/mysql.sock (2) "; 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到…

Python 【机器学习】 进阶 之 【实战案例】房价数据中位数分析 [ 项目介绍 ] [ 获取数据 ] [ 创建测试集 ]| 1/3(含分析过程)

Python 【机器学习】 进阶 之 【实战案例】房价数据中位数分析 [ 项目介绍 ] [ 获取数据 ] [ 创建测试集 ]| 1/3&#xff08;含分析过程&#xff09; 目录 Python 【机器学习】 进阶 之 【实战案例】房价数据中位数分析 [ 项目介绍 ] [ 获取数据 ] [ 创建测试集 ]| 1/3&#x…

118页|2023大模型落地应用案例集

大语言模型开放平台旨在为大语言模型技术的研究和应用提供一个开放、可扩展、可协作的环境。该平台不仅为开发者提供大型语言模型、大规模数据集、模型微调工具以及大型语言模型应用开发工具等资源&#xff0c;还加速了大型语言模型的训练过程&#xff0c;促进了大型语言模型在…

论文复现丨带时间窗和服务顺序的多车辆路径问题:联合优化遗传算法

路径优化系列文章&#xff1a; 1、路径优化历史文章2、路径优化丨带时间窗和载重约束的CVRPTW问题-改进遗传算法&#xff1a;算例RC1083、路径优化丨带时间窗和载重约束的CVRPTW问题-改进和声搜索算法&#xff1a;算例RC1084、路径优化丨复现论文-网约拼车出行的乘客车辆匹配及…

Linux命令行 复制模式/扩展模式 调用系统功能切换

问题背景 公司软件需要从window 适配国产操作系统&#xff0c;目前使用wine方案。在我们软件有个切换屏幕模式的功能&#xff0c;需要支持用户在我们软件内&#xff0c;切换复制模式/扩展模式。 在linux 下 uos/deepin 等系统。如果要从复制模式设置为扩展模式使用命令行时&a…