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

洛谷 P5836 [USACO19DEC] Milk Visits S-普及/提高-

P5836 [USACO19DEC] Milk Visits S

题目描述

Farmer John 计划建造 NNN 个农场,用 N−1N-1N1 条道路连接,构成一棵树(也就是说,所有农场之间都互相可以到达,并且没有环)。每个农场有一头奶牛,品种为更赛牛或荷斯坦牛之一。

Farmer John 的 MMM 个朋友经常前来拜访他。在朋友 iii 拜访之时,Farmer John 会与他的朋友沿着从农场 AiA_iAi 到农场 BiB_iBi 之间的唯一路径行走(可能有 Ai=BiA_i = B_iAi=Bi)。除此之外,他们还可以品尝他们经过的路径上任意一头奶牛的牛奶。由于 Farmer John 的朋友们大多数也是农场主,他们对牛奶有着极强的偏好。他的有些朋友只喝更赛牛的牛奶,其余的只喝荷斯坦牛的牛奶。任何 Farmer John 的朋友只有在他们访问时能喝到他们偏好的牛奶才会高兴。

请求出每个朋友在拜访过后是否会高兴。

输入格式

输入的第一行包含两个整数 NNNMMM

第二行包含一个长为 NNN 的字符串。如果第 iii 个农场中的奶牛是更赛牛,则字符串中第 iii 个字符为 G,如果第 iii 个农场中的奶牛是荷斯坦牛则为 H

以下 N−1N-1N1 行,每行包含两个不同的整数 XXXYYY1≤X,Y≤N1 \leq X, Y \leq N1X,YN),表示农场 XXXYYY 之间有一条道路。

以下 MMM 行,每行包含整数 AiA_iAiBiB_iBi,以及一个字符 CiC_iCiAiA_iAiBiB_iBi 表示朋友 iii 拜访时行走的路径的端点,CiC_iCiGH 之一,表示第 iii 个朋友喜欢更赛牛的牛奶或是荷斯坦牛的牛奶。

输出格式

输出一个长为 MMM 的二进制字符串。如果第 iii 个朋友会感到高兴,则字符串的第 iii 个字符为 1,否则为 0

输入输出样例 #1

输入 #1

5 5
HHGHG
1 2
2 3
2 4
1 5
1 4 H
1 4 G
1 3 G
1 3 H
5 5 H

输出 #1

10110

说明/提示

在这里,从农场 1 到农场 4 的路径包括农场 1、2 和 4。所有这些农场里都是荷斯坦牛,所以第一个朋友会感到满意,而第二个朋友不会。

关于部分分:

测试点 111 样例。

测试点 2∼52\sim 525 满足 N≤103N\le 10^3N103M≤2⋅103M\le 2\cdot 10^3M2103

对于 100%100\%100% 的数据,1≤N≤1051 \leq N \leq 10^51N1051≤M≤1051 \leq M \leq 10^51M105

供题:Spencer Compton

solution

  • 1 以 1 为根节点。统计每个节点 u 到根节点的 H 和 G 奶牛的个数 H[u], G[u]
  • 2 找到 x,y 的最小公共祖先 z, 则 H 奶牛数量为 H[x] + H[y] - 2H[z] + a[z],G 也相同计算

代码

#include <iostream>
#include "bit"
#include "vector"
#include "unordered_set"
#include "set"
#include "queue"
#include "algorithm"
#include "bitset"
#include "cstring"using namespace std;/** 题目大意:n (<=1e5) 个农场组成一颗树,每个农场养 H 和 G 奶牛种的一种. m(<=2e3)个人,每人喜欢* H 和 G 奶牛中的一种,并且选择两个点从x,y,问他在路上能否碰到自己喜欢的牛* 思路:* 1 以 1 为根节点。统计每个节点 u 到根节点的 H 和 G 奶牛的个数 H[u], G[u]* 2 找到 x,y 的最小公共祖先 z, 则 H 奶牛数量为 H[x] + H[y] - 2H[z] + a[z],G 也相同计算*/const int N = 1e5 + 1;int n, m, H[N], G[N], d[N], f[N][20];
char a[N];
vector<int> e[N];void dfs(int u, int p) {f[u][0] = p;for (int i = 1; i < 20; i++) f[u][i] = f[f[u][i - 1]][i - 1];H[u] = H[p] + (a[u] == 'H');G[u] = G[p] + (a[u] == 'G');d[u] = d[p] + 1;for (int v: e[u]) {if (v != p) {dfs(v, u);}}
}int lca(int x, int y) {if (x == y) return x;if (d[x] < d[y]) swap(x, y);for (int i = 19; d[x] != d[y]; i--)if (d[f[x][i]] >= d[y]) x = f[x][i];if (x == y) return x;for (int i = 19; i >= 0; i--)if (f[x][i] != f[y][i]) x = f[x][i], y = f[y][i];return f[x][0];
}int main() {cin >> n >> m;for (int i = 1; i <= n; i++) cin >> a[i];for (int i = 1; i < n; i++) {int x, y;cin >> x >> y;e[x].push_back(y);e[y].push_back(x);}dfs(1, 0);for (int i = 1; i <= m; i++) {int x, y;char c;cin >> x >> y >> c;int z = lca(x, y);if (c == 'H') {int t = H[x] + H[y] - 2 * H[z] + (a[z] == 'H');cout << (t ? 1 : 0);} else {int t = G[x] + G[y] - 2 * G[z] + (a[z] == 'G');cout << (t ? 1 : 0);}}return 0;
}

结果

在这里插入图片描述

http://www.xdnf.cn/news/19473.html

相关文章:

  • 贪心算法解决钱币找零问题(二)
  • 基于单片机倒车雷达/超声波测距设计
  • Linux->网络入门
  • 《论文阅读》从心到词:通过综合比喻语言和语义上下文信号产生同理心反应 2025 ACL findings
  • infinityfree mysql 加入数据库部分 filezilla 设备共享图片和文本不用浏览器缓存
  • 第六章 Vue3 + Three.js 实现高质量全景图查看器:从基础到优化
  • hive表不显示列注释column comment的问题解决
  • Linux signal 图文详解(二)信号发送
  • 为什么服务器接收 URL 参数时会接收到解码后的参数
  • DHT11-温湿度传感器
  • openEuler2403部署Redis8集群
  • 京东入局外卖,还有很多问题。
  • Ubuntu 服务器实战:Docker 部署 Nextcloud+ZeroTier,打造可远程访问的个人云
  • 学习 Android (十八) 学习 OpenCV (三)
  • OpenHarmony 分布式感知中枢深度拆解:MSDP 框架从 0 到 1 的实战指南
  • 餐饮外卖同城配送酒水寄存餐品加价换购促销小程序APP
  • Windows 安装配置解压版MongoDb
  • TFT屏幕:STM32硬件SPI+DMA+队列自动传输
  • 【RelayMQ】基于 Java 实现轻量级消息队列(五)
  • 2025 最新Vue前端面试题目 (9月最新)
  • AI 重构医疗诊断:影像识别准确率突破 98%,基层医院如何借技术缩小诊疗差距?
  • 设备服务管理上报方案
  • 两轮车车机 OS 演进路线深度解析
  • libmodbus源码分析
  • 【前端】《手把手带你入门前端》前端的一整套从开发到打包流程, 这篇文章都会教会你;什么是vue,Ajax,Nginx,前端三大件?
  • 差角函数差角矩阵位置编码
  • 无需服务器也能建网站:Docsify+cpolar让技术文档分享像写笔记一样简单
  • 手机版碰一碰发视频源码搭建,技术实现与实操指南
  • 鸿蒙开发进阶(HarmonyOS)
  • Unity中多线程与高并发下的单例模式