新闻详情

新闻详情

首页 / 资讯中心 / 详情

小红树【牛客tracker 每日一题】

发布时间:2026/9/29 10:40:09来源:尧图网络
小红树【牛客tracker  每日一题】
小红树时间限制1 秒空间限制256M网页链接牛客tracker牛客tracker 每日一题完成每日打卡即可获得牛币。获得相应数量的牛币能在【牛币兑换中心】换取相应奖品助力每日有题做丰盈牛币日益多题目描述小红拿到了一棵树每个节点被染成了红色或者蓝色。小红定义每条边的权值为删除这条边时形成的两个子树的同色连通块数量之差的绝对值。小红想知道所有边的权值之和是多少输入描述第一行输入一个正整数n nn代表节点的数量。第二行输入一个长度为n nn且仅由R和B两种字符构成的字符串第i ii个字符为R代表i ii号节点被染成红色为B则被染成蓝色。接下来的n − 1 n - 1n−1行每行输入两个正整数u uu和v vv代表节点u uu和节点v vv有一条边相连。1 ≤ n ≤ 200000 1 \le n \le 2000001≤n≤200000输出描述一个正整数代表所有节点的权值之和。注题面原文写的是“所有节点的权值之和”但结合描述与示例实际所求为所有边的权值之和。示例 1输入4 BBRR 1 2 3 2 4 1输出2说明该树的示意图如下1(B) / \ 2(B) 4(R) / 3(R)1 - 2 1\text{-}21-2这条边的权值为0 00因为删除后两个子树的同色连通块都是2 22。3 - 2 3\text{-}23-2这条边的权值为1 11因为删除后两个子树的同色连通块数量分别是1 11和2 22。1 - 4 1\text{-}41-4这条边的权值为1 11因为删除后两个子树的同色连通块数量分别是2 22和1 11。答案为0 1 1 2 0 1 1 20112。数据范围与提示1 ≤ n ≤ 200000 1 \le n \le 2000001≤n≤200000字符集为{ R , B } \{\texttt{R}, \texttt{B}\}{R,B}核心思路先做一次树形 DP求出以1 11为根时每棵子树v vv内部的同色连通块数量c n t v cnt_vcntv​c n t v 1 ∑ c ∈ s o n ( v ) ( c n t c − [ c o l o r ( v ) c o l o r ( c ) ] ) cnt_v 1 \sum_{c \in son(v)} \left( cnt_c - [\,color(v) color(c)\,] \right)cntv​1c∈son(v)∑​(cntc​−[color(v)color(c)])其中若v vv与子节点c cc同色则v vv所在块与c cc所在块会合并成一个故减1 11。整棵树的总连通块数C c n t 1 C cnt_{1}Ccnt1​。对一条边( u , v ) (u, v)(u,v)v vv为子节点删除后两侧块数分别为c n t v 和 C − c n t v [ c o l o r ( u ) c o l o r ( v ) ] cnt_v \quad\text{和}\quad C - cnt_v [\,color(u) color(v)\,]cntv​和C−cntv​[color(u)color(v)]后者含义是若父子同色切断后父侧需要单独“补回”一块。该边权值即为两者之差的绝对值累加所有边即得答案。由于n nn可达2 × 10 5 2 \times 10^52×105递归 DFS 可能爆栈建议改用显式栈的迭代写法或手动调大栈空间。时间复杂度O ( n ) O(n)O(n)。解题思路本题是树形 DP 同色连通块计数的经典问题。给定一棵树每个节点染成红色或蓝色。定义每条边的权值为删除该边后形成的两个子树中同色连通块数量之差的绝对值。求所有边的权值之和。1. 问题等价转化同色连通块在树中若两个相邻节点颜色相同则它们属于同一个同色连通块否则属于不同块。对于任意节点u uu设f [ u ] f[u]f[u]表示以u uu为根的子树内部包含u uu的同色连通块数量。整棵树的总同色连通块数量记为C f [ 1 ] C f[1]Cf[1]以 1 为根。考虑一条边( u , v ) (u, v)(u,v)其中v vv是u uu的子节点。删除这条边后树被分成两部分以v vv为根的子树其内部同色连通块数为f [ v ] f[v]f[v]。剩余部分包含u uu及其他节点其同色连通块数需要重新计算。原本整棵树的总块数为C CC去掉v vv子树后若u uu与v vv同色则原本它们所在的块是合并的删除边后这个块分裂因此剩余部分的块数比C − f [ v ] C - f[v]C−f[v]多 1若u uu与v vv异色则删除边不会造成额外分裂剩余部分块数就是C − f [ v ] C - f[v]C−f[v]。因此剩余部分的同色连通块数为other C − f [ v ] [ color ( u ) color ( v ) ] \text{other} C - f[v] [\text{color}(u) \text{color}(v)]otherC−f[v][color(u)color(v)]该边的权值即为∣ f [ v ] − other ∣ |f[v] - \text{other}|∣f[v]−other∣累加所有边的权值即得答案。2. 算法实现建树读入n nn和颜色字符串s ss下标从 1 开始用邻接表存储无向边。第一次 DFSd1计算子树同色连通块数从根节点 1 出发递归遍历所有子节点。初始化f [ u ] 1 f[u] 1f[u]1。对于每个子节点x xx先递归求出f [ x ] f[x]f[x]然后累加f [ u ] f [ x ] f[u] \mathrel{} f[x]f[u]f[x]。若s [ u ] s [ x ] s[u] s[x]s[u]s[x]说明u uu与x xx同色它们所在的块合并因此f [ u ] − 1 f[u] \mathrel{-} 1f[u]−1。最终f [ 1 ] f[1]f[1]即为整棵树的总同色连通块数C CC。第二次 DFSd2累加边权再次从根节点 1 出发遍历每条边( u , x ) (u, x)(u,x)x xx为子节点。计算剩余部分的块数v f[1] - f[x]若s [ u ] s [ x ] s[u] s[x]s[u]s[x]则v。边权为abs(v - f[x])累加到答案ans。递归处理子节点。输出答案ans即为所有边权之和。3. 复杂度分析时间复杂度两次 DFS 均遍历所有节点和边一次每次操作O ( 1 ) O(1)O(1)总时间复杂度O ( n ) O(n)O(n)。n ≤ 2 × 10 5 n \le 2\times 10^5n≤2×105完全可行。空间复杂度邻接表O ( n ) O(n)O(n)数组f ff和递归栈深度O ( n ) O(n)O(n)建议使用迭代或手动扩栈防止爆栈。总结通过树形 DP 预处理出每棵子树的同色连通块数量再利用整棵树的总块数推导出删除任意边后两侧的块数。核心在于理解“同色边合并”导致删除时可能产生额外分裂。算法线性高效能够处理2 × 10 5 2\times 10^52×105规模的数据。代码简要说明全局变量n节点数s颜色字符串g邻接表f[N]存储子树同色连通块数ans累加边权。d1(u, fa)函数后序遍历计算f [ u ] f[u]f[u]。先置f [ u ] 1 f[u]1f[u]1对每个子节点x xx递归累加f [ x ] f[x]f[x]若同色则减 1。d2(u, fa)函数前序遍历处理边权。对每个子节点x xx先递归处理x xx然后计算剩余部分块数v f[1] - f[x] (s[u]s[x])累加abs(v - f[x])到ans。主函数读入数据建图调用d1(1, -1)和d2(1, -1)输出ans。代码内容#includebits/stdc.husingnamespacestd;#defineendl\ntypedeflonglongll;typedefunsignedlonglongull;typedefvectorvectorllvvt;typedefpairll,llpll;constll N2e510;constll INF1e18;constll M1e610;constll mod1e97;ll n;ll f[N];string s;vectorllg[N];ll ans;voidd1(ll u,ll fa){f[u]1;for(ll x:g[u]){if(xfa)continue;d1(x,u);f[u]f[x];if(s[u]s[x])f[u]--;}}voidd2(ll u,ll fa){for(ll x:g[u]){if(xfa)continue;d2(x,u);ll vf[1]-f[x];if(s[u]s[x])v;ansabs(v-f[x]);}}intmain(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);ll a,b;cinns;s$s;n--;while(n--){cinab;g[a].push_back(b);g[b].push_back(a);}d1(1,-1);d2(1,-1);coutansendl;return0;}
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

从一个需求到一个系统:全栈工程师的架构设计实战——订单系统的从零推演 2026/9/29 11:52:11

从一个需求到一个系统:全栈工程师的架构设计实战——订单系统的从零推演

摘要:前面三篇分别讲了系统的运转(请求生命周期)、排障(深夜告警)和预测(容量规划),这篇讲更前置的能力:拿到一个新需求,怎么从一张白纸推演出一套合理的架构…

阅读更多 →
MCP 入门到落地:用 TaoToken 统一 Key 打通智能体与工具协同的配置实战 2026/9/29 11:51:27

MCP 入门到落地:用 TaoToken 统一 Key 打通智能体与工具协同的配置实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Python实战第1期:Python环境搭建与第一个程序 2026/9/29 11:51:01

Python实战第1期:Python环境搭建与第一个程序

文章目录引言:为什么要学Python?一、安装Python1. 下载Python2. 安装Python(Windows)3. 验证安装二、安装VS Code1. 下载VS Code2. 安装VS Code3. 安装Python扩展三、第一个Python程序:Hello World1. 创建项目文件夹2.…

阅读更多 →
Cherry Studio 工具介绍及调用 MCP 服务案例:用 TaoToken 统一 Key 打通 ModelScope API 2026/9/29 11:50:40

Cherry Studio 工具介绍及调用 MCP 服务案例:用 TaoToken 统一 Key 打通 ModelScope API

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Linux命令入门1 2026/9/29 11:50:34

Linux命令入门1

可代替cattac:tac 是 Linux 下的一个有趣命令。它和 cat 类似,但会将文件内容的每一行倒序输出,最后一行会显示在第一行。比如:tac /tmp/flag.txt 有时候如果服务不允许 cat 命令,攻击者会尝试用 tac,因为 tac 实际上也…

阅读更多 →
KaiwuDB-lite实测:边缘时序数据库部署避坑与稳定性观察 2026/9/29 11:50:14

KaiwuDB-lite实测:边缘时序数据库部署避坑与稳定性观察

这个标题是我在群里随手留的。起因很简单:我这边有个工业现场的边缘节点要落地,需要一套轻量级的时序数据库来处理传感器数据,看到 KaiwuDB-lite 后我就直接上手测了。测完之后,脑子里就剩一句话——“你别挨骂了”。这六个字不是…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉