洛谷题单指南-图论之树-P5836 [USACO19DEC] Milk Visits S

news/2025/3/18 11:31:38/文章来源:https://www.cnblogs.com/jcwy/p/18777012

原题链接:https://www.luogu.com.cn/problem/P5836

题意解读:树中节点有两种状态:G、H,给m个路径a->b,如果路径上有一个状态是c值,则输出1,否则输出0。

解题思路:

1、勤奋的做法:树链剖分

理解了题意,第一想到的就是树链剖分,通过线段树节点维护区间是否包括G、是否包括H,这两个状态都很容易通过区间合并得到,剩下就是常规的树链剖分以及线段树区间查询,直接给出完整代码。

100分代码:

#include <bits/stdc++.h>
using namespace std;const int N = 100005;vector<int> g[N];
int siz[N], depth[N], fa[N], son[N], dfn[N], rk[N], top[N], cnt; //树链剖分相关
char a[N]; //节点值
struct Node
{int l, r;bool hasG, hasH;
} tr[N * 4]; //线段树
int n, m;void dfs1(int u, int p, int d)
{depth[u] = d;fa[u] = p;siz[u] = 1;for(auto v : g[u]){if(v == p) continue;dfs1(v, u, d + 1);siz[u] += siz[v];if(siz[v] > siz[son[u]]) son[u] = v;}
}void dfs2(int u, int t)
{top[u] = t;dfn[u] = ++cnt;rk[cnt] = u;if(son[u]) dfs2(son[u], t);for(auto v : g[u]){if(v == fa[u] || v == son[u]) continue;dfs2(v, v);}
}void pushup(Node &root, Node &left, Node &right)
{root.hasG = left.hasG | right.hasG;root.hasH = left.hasH | right.hasH;
}void pushup(int u)
{pushup(tr[u], tr[u << 1], tr[u << 1 | 1]);
}void build(int u, int l, int r)
{tr[u] = {l, r};if(l == r){if(a[rk[l]] == 'G') tr[u].hasG = true;else tr[u].hasH = true;}else{int mid = l + r >> 1;build(u << 1, l, mid);build(u << 1 | 1, mid + 1, r);pushup(u);}
}Node query(int u, int l, int r)
{if(tr[u].l >= l && tr[u].r <= r) return tr[u];else if(tr[u].l > r || tr[u].r < l) return {0, 0, 0, 0};else {Node res = {0, 0, 0, 0};Node left = query(u << 1, l, r);Node right = query(u << 1 | 1, l, r);pushup(res, left, right);return res;}
}int queryPath(int u, int v, char target)
{Node ans = {0, 0, 0, 0};while(top[u] != top[v]){if(depth[top[u]] < depth[top[v]]) swap(u, v);Node res = query(1, dfn[top[u]], dfn[u]);pushup(ans, ans, res);u = fa[top[u]];}if(depth[u] > depth[v]) swap(u, v);Node res = query(1, dfn[u], dfn[v]);pushup(ans, ans, res);if(target == 'G' && ans.hasG || target == 'H' && ans.hasH) return 1;return 0;
}int main()
{cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);cin >> n >> m;for(int i = 1; i <= n; i++) cin >> a[i];for(int i = 1; i < n; i++){int u, v;cin >> u >> v;g[u].push_back(v);g[v].push_back(u);}dfs1(1, 0, 0);dfs2(1, 1);build(1, 1, n);while(m--){int a, b;char c;cin >> a >> b >> c;cout << queryPath(a, b, c);}cout << endl;return 0;
}

2、聪明的做法:连通块+并查集

树上所有节点可以按照G或者H划分多个连通块,如果属于同一个连通块(状态相同),可以通过并查集对相邻节点进行合并;

对于每次询问a b c,只有a、b属于同一个连通块且状态与c不相同才能输出0,其他情况都输出1;

因为,只要不属于同一个连通块,路径中必然会有两种状态。

100分代码:

#include <bits/stdc++.h>
using namespace std;const int N = 100005;char s[N];
int p[N];
int n, m;int find(int x)
{if(p[x] != x) p[x] = find(p[x]);return p[x];
}int main()
{cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);cin >> n >> m;for(int i = 1; i <= n; i++) {cin >> s[i];p[i] = i; //并查集初始化}for(int i = 1; i < n; i++){int u, v;cin >> u >> v;if(s[u] == s[v]) p[find(u)] = find(v);}while(m--){int a, b;char c;cin >> a >> b >> c;if(find(a) == find(b) && s[a] != c) cout << 0;else cout << 1;}return 0;
}

 

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

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

相关文章

树上前缀和

树上前缀和 题目链接 多次询问树上的一些路径的权值和点前缀和 \(s[i]\)代表从根节点到节点\(i\)的点权和 先自顶向下计算出前缀和\(s[i]\),然后利用前缀和拼凑\((x, y)\)的路径和 \(s[x] + s[y] - s[lca] - s[fa[lca]]\)边前缀和 \(s[i]\)代表从根节点到节点\(i\)的边权和 先…

Matlab深度学习ResNet、迁移学习多标签图像分类及超分辨率处理Grad CAM可视化分析COCO、手写数字数据集

全文链接:https://tecdat.cn/?p=40982 在当今数字化时代,图像分类和图像超分辨率处理是计算机视觉领域的重要研究方向。深度学习技术的发展为解决这些问题提供了强大的工具。本文将详细介绍如何使用Matlab构建多标签图像分类模型和图像到图像的回归网络,以实现图像超分辨率…

2025年Manus、Deepseek通用AI智能体技术发展报告70+份汇总解读|附PDF下载

原文链接:https://tecdat.cn/?p=41001 随着人工智能技术从对话交互向任务执行跃迁,通用型AI智能体(Agent)成为重塑生产力的核心载体。本报告深度剖析全球首款通用AI智能体Manus的技术架构、市场表现及行业影响,揭示其如何通过自主决策能力突破传统AI的边界,并为企业与开…

2024全球财务采用AI报告60+份汇总解读|附PDF下载

原文链接:https://tecdat.cn/?p=40915 人工智能技术正以颠覆性力量重塑全球财务职能,德勤最新研究显示,财务AI市场规模预计2025年将突破120亿美元,年复合增长率达28%。本报告汇总解读基于《KPMG国际:2024全球财务采用AI报告》及文末68份行业研究报告的数据,报告合集已分…

C语言01

1、按f7后f5,打开程序看运行到哪,再打开寄存器窗口和内存窗口 shift➕f结束 二.c语言格式 三.函数的反汇编分析 1.空函数 例:编写一个空函数,没参数也没返回值,分析函数f7,f5后右键反汇编从call开始写再f11打开进函数里面,有jmp 再f11跳转jmp到0040D6F0,开栈(即提升堆…

虚幻unreal4.27源码编译编辑器流程与问题汇总

当你使用的是源码编译的虚幻unreal编辑器https://github.com/orgs/EpicGames/teams/developers搜索到你想要的版本对应的分支,并进入切换或者从这里下载稳定发布版。(注意下载4.27.2压缩包可能才380+M,解压后要113G+,所以最好预留空间120G) 在这里键入cmdH:\UnrealEngine-…

安装并运行Cloudreve个人网盘:详细步骤指南

安装并运行Cloudreve个人网盘:详细步骤指南 在本文中,我们将指导您如何安装并运行Cloudreve个人网盘,以及如何将其与阿里云OSS集成,实现高效的文件存储和管理。 步骤 1: 下载Cloudreve安装包 首先,您需要下载Cloudreve的安装包。请在您的Linux终端中执行以下命令: bash复…

算法心得(4)**快速排序和归并排序**

我们这里讨论的排序是把数组元素排成从小到大的顺序(升序) **快速排序** 先直接上模板: /***************** function:对数组进行快速排序* para:q[](待排序数组),l(数组左边界),r(数组右边界)* return:void*/ void fastSort(long long q[], int l, int r) {if (l >= r…

Redis应用_会话管理

Redis应用——会话管理 ​ 会话管理的核心是跟踪用户的会话状态,通常为每个用户分配一个唯一的会话 ID(Session ID),将用户的相关信息存储在服务器端,并通过该 ID 进行关联和查询。Redis 可以作为存储会话信息的数据库,将会话 ID 作为键,用户信息作为值进行存储。 一、配…

2025版PLM选型标准:10个行业TOP3厂商适配性对比

产品生命周期管理(PLM)系统在企业的产品研发、生产与管理过程中扮演着至关重要的角色。随着时间的推移,到 2025 年,不同行业对于 PLM 系统的需求更加多样化和精细化。选择一款适配自身行业特点的 PLM 系统,成为众多企业提升竞争力的关键举措。接下来,我们将深入探讨 10 个…

对象存储COS 云顾问:安全管理重磅升级,守护数据安全!

导语 在数字化浪潮下,对象存储 COS 作为海量数据的核心载体,安全防护能力至关重要。存储桶配置不当可能引发数据泄露、流量盗刷等安全问题,因此腾讯云对象存储 COS 基于云顾问的云巡检能力,正式推出全新「安全管理」功能,通过智能巡检、多维评估、实时管控三大核心能力,为…