换根dp CF div2 Round 899 Tree Xor

news/2025/1/10 15:25:03/文章来源:https://www.cnblogs.com/Shumian/p/18664068

题目链接:[CF div2 Round 899 Tree Xor](Problem - D - Codeforces)

题目描述:

给定一个具有\(n\)个顶点的树,顶点从1到\(n\)标记。对于每个顶点\(i\),标有整数\(a_i\),其中\(i=1,2,…,n\).您希望通过执行一些(可能为零)咒语使所有\(a_i\)相等。假设您在某个顶点处为根。

在每个咒语中,您可以选择任意顶点\(v\)和任意非负整数\(c\)。然后对于所有在顶点\(v\)的子树中的顶点\(i\),将\(a_i\)替换为\(a_i⊕c\)。该咒语的成本为\(s⋅c\),其中\(s\)是子树中的顶点数。这里⊕⊕表示按位异或运算。

\(m_r\)为选择顶点\(r\)作为树的根时使所有\(a_i\)相等所需的最小总成本。找出\(m_1,m_2,…,m_n\)。假设选择顶点\(r\)作为树的根。那么如果从\(i\)\(r\)的简单路径包含\(v\),则顶点\(i\)属于\(v\)的子树。

输入:

每个测试包含多个测试用例。第一行包含测试用例的数量 \(t(1≤t≤10^4)\)。随后是测试用例的描述。

每个测试用例的第一行包含单个整数 \(n(1≤n≤2⋅10^5)\)

每个测试用例的第二行包含 \(nn 个整数 a_1,a_2,…,a_n(0≤a_i<2^{20})\)

接下来的\(n−1\)行中,每行包含两个整数\(u\)\(v\)\((1≤u,v≤n)\),表示存在一条连接顶点\(u\)\(v\)的边。

保证给定的边构成一棵树。

保证所有测试用例中\(n\)的总和不超过\(2 \cdot 10^{5}\).

输出:对于每个测试用例,将 \(m_1,m_2,…,m_n\) 每个元素在新的一行上打印出来

Example

input

2
4
3 2 1 0
1 2
2 3
2 4
1
100

output

8 6 12 10 
0 

解题思路:

求解每一个结点作为根节点,或者求解选一个结点作为根节点的最优情况,一般来说换根DP.
\(siz[u]: 以结点u为根的子树的结点个数\)
\(dp[u]:以u为根结点的子树上,所有结点权值变成相同数,所需要的花费\)
使得父节点\(u\)和子节点\(v\)权值相同的花费为\(siz[v]*(a[u]⊕a[v])\)
\(siz[u]=\sum siz[v]+1\)
\(dp[u]=\sum dp[v]+(a[u]⊕a[v])*siz[v]\)

第一次dfs算出以1为根时,所有结点siz[]和dp[],dp[1]就是m1
接下来考虑换根(以其他结点为根)
对于每次换根,假设将根由u换成儿子v,那么对于v的所有子节点,不需要再进行异或操作,那么代价减少siz[v]* \((a_u⊕a_v)\) ,还要将u这一子树的所有结点进行异或操作,花费增加\((a_u ⊕a_v)*(n-siz[v])\)
\(dp[v] = (dp[u] - siz[v] * (a[u]⊕a[v])) + (siz[1] - siz[v]) * (a[u] ⊕ a[v])\)

代码

// Problem: D. Tree XOR
// Contest: Codeforces - Codeforces Round 899 (Div. 2)
// URL: https://codeforces.com/contest/1882/problem/D
// Memory Limit: 512 MB
// Time Limit: 3000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include<bits/stdc++.h>
using namespace std;
using ll=long long;
using i128=__int128;
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
#define inf 0x3f3f3f3f
#define infll 0x3f3f3f3f3f3f3f3fLL
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll>pll;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a*b/gcd(a,b);}
ll power(ll x,ll y,ll p){ll res=1;x=x%p;while(y>0){if(y&1)res=(1ll*res*x)%p;y>>=1;x=(1ll*x*x)%p;}return res;}
ll mod_inv(ll x,ll p){return power(x,p-2,p);}
ll ceilDiv(ll n,ll m){if(n>=0)return (n+m-1)/m;else return n/m;}
#define int long long
void solve()
{int n;cin>>n;vector<int>a(n+1),dp(n+1),siz(n+1);vector<vector<int>>adj(n+1);for(int i=1;i<=n;i++)cin>>a[i];for(int i=1;i<n;i++){int u,v;cin>>u>>v;adj[u].pb(v);adj[v].pb(u);}auto dfs=[&](auto dfs,int u,int fa)->void{siz[u]=1;for(auto v:adj[u]){if(v==fa)continue;dfs(dfs,v,u);siz[u]+=siz[v];dp[u]+=dp[v]+siz[v]*(a[u]^a[v]);}};   dfs(dfs,1,0);auto dfs2=[&](auto dfs2,int u,int fa)->void{for(auto v:adj[u]){if(v==fa)continue;dp[v] = (dp[u] - siz[v] * (a[u] ^ a[v])) + (siz[1] - siz[v]) * (a[u] ^ a[v]);dfs2(dfs2, v, u);}};   dfs2(dfs2,1,0);for(int i=1;i<=n;i++)cout<<dp[i]<<' ';cout<<endl;
}
signed main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int _=1;cin>>_;while(_--)solve();return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UDS-ECU程序刷写

UDS(unified diagnostic services)统一诊断服务主要是针对汽车上对ECU进行诊断服务规范,下图是UDS在OSI分层中的具体规范,基于UDS的刷写应用逻辑体现在应用层的ISO14229规范。一、功能介绍 UDS(unified diagnostic services)统一诊断服务主要是针对汽车上对ECU进行诊断服…

主体分割技术,提升图像信息提取能力

在智能设备普及和AI技术进步的推动下,用户对线上互动的质量、个性化以及沉浸式体验的追求日益增强。例如,对于热衷于图片编辑或视频制作的用户来说,他们需要一种快速而简便的方法来将特定主体从背景中分离出来。 HarmonyOS SDK 基础视觉服务(Core Vision Kit)提供主体分割…

qt 实现窗口置顶,qtdesigner创建的widget窗口集成程序里的用法

参考 https://blog.csdn.net/Larry_Yanan/article/details/123518788 .ui文件如下新建的ui文件,编译一下就会生成对应的 ui_xxx.h 文件,文件内就有对应的 namespace Ui 声明的变量,这个变量要在mainwindow.h中声明,然后在mainwindow.cpp中new出来,具体使用如下 mainwindow…

如何在市场推广活动中实现精准的任务分配?5个项目管理技巧

一、引言 随着市场竞争的加剧和消费者需求的多样化,企业对市场推广活动的要求越来越高。市场推广活动不仅需要创意和精准的目标定位,还需要高效的执行和完善的管理。在这种背景下,如何通过有效的活动管理来提升推广活动的执行力,已成为市场团队面临的一个巨大挑战。 市场推…

Android编译 - 证书介绍

前言全局说明一、说明 1.1 环境: Android1.2 简介 在Android系统中,每个APK文件必须有一个有效的数字证书来证明其来源和完整性。当需要修改APK后再次发布时,原有的签名将不再有效,因此需要重新签名。二、证书工具 2.1 路径: android/build/tools/releasetools/sign_target…

域名解析的QPS防护值是什么?

在当今数字化的时代,互联网已经渗透到生活的方方面面,而域名解析作为互联网运行的关键环节之一,起着至关重要的作用。其中,域名解析的QPS防护值更是保障网络稳定、安全与高效的一个重要指标。 一、QPS 防护值的定义与内涵 QPS,即Queries Per Second,意为每秒查询次数。域…

远程开机详细教程

要实现远程开机,被控端必须满足以下条件: 1.目前仅支持windows系统实现远程开机 2.被控端所在局域网内,需要有另一台设备保持todesk在线 如:其他电脑、iPhone、iPad、Android 设备(手机、平板)、家人的手机(充当辅助开机设备) 如图,辅助开机设备需显示在线,离线状态无法发…

CH585的SPI驱动WS2812

目录 链接: https://pan.baidu.com/s/1Su5dgmVWLre5kH2fYiGwQQ?pwd=wch6 CH573系列/583系列/592系列MCU,在使用SPI模拟WS2812波形时,MISO-PA15引脚上的实时电平,会影响MOSI-PA14引脚上的空闲电平状态,故建议SPI驱动WS2812的场景下,固定PA15的电平,不要接其他外设。异常场…

企业微信客服系统-实现对接微信客服接口与分配客服功能-实现GPT回复功能

企业微信客服是有对外的接口的,可以将用户发过来的消息传递给我们系统(注意,这里说的是企业微信客服,不是企业微信员工,也不是个人微信,这三个不是一回事)。并且,我们系统还可以实现,多个微信客服入口,分配到多个我们客服坐席,客服不在线时,可以分配给别人。微信客…

异地多活架构如何设计:活好你也好【转】

异地多活是分布式系统架构设计的一座高峰,当业务系统走到需要考虑异地多活这一步,其体量和复杂度都会达到很高的水准。接入层、逻辑层、数据层的三层架构,基本上是每个业务都会拥有的基础架构形态,而三层架构的关键在于数据层,本文将从数据层切入探讨异地多活对于基础架构…