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

《算法竞赛·快冲300题》每日一题:“01树”

算法竞赛·快冲300题》将于2024年出版,是《算法竞赛》的辅助练习册。
所有题目放在自建的OJ New Online Judge。
用C/C++、Java、Python三种语言给出代码,以中低档题为主,适合入门、进阶。

文章目录

  • 题目描述
  • 题解
  • C++代码
  • Java代码
  • Python代码

01树” ,链接: http://oj.ecustacm.cn/problem.php?id=1715

题目描述

【题目描述】 现在给你一个n个节点的树,而且每个节点有一个权值为0或者1。
   现在有m次询问,每次询问输入两个节点x和y,以及一个权值k。
   请你判断x和y的路径中是否存在权值为k的点。(包括x和y本身)
【输入格式】 输入第一行为两个正整数n和m,均为不超过10^5次方的正整数。
   第二行是一个长度为n的01字符串,表示从节点1到节点n的权值。
   接下来n-1行,每行两个数字u和v,表示节点u和v之间存在边。
   接下来m行,每行输入三个数字x,y,k。其中x,y不相同,k为0或者1。 。
【输出格式】 对于每一次询问,如果x和y的路径中包含权值为k的点,输出Yes,否则输出No 。
【输入样例】

5 5
11010
1 2
2 3
2 4
1 5
1 4 1
1 4 0
1 3 0
1 3 1
5 5 1

【输出样例】

Yes
No
Yes
Yes
No

题解

   本题简单的做法是先建树,然后每次查询用DFS搜索路径。任意两点之间有且只有一条路径,做一次DFS能找到这条路径,计算量O(n)。一共做m次查询,总复杂度O(mn),超时。
   不过,本题特殊在于每个点的权值是0或1,查询也是查有没有等于0或1的点。查询一条路径时,如果能确定所有点都是1,或所有点都是0,或有0有1,那么就得到了答案。
   把所有点按0和1分成多个子集,其中一些连通的1是一个子集,一些连通的0是一个子集。最后把整棵树分成很多权值为1的子集、权值为0的子集。权值为0的子集和权值为1的子集相邻。
   对一个查询“x,y,k”:
   (1)如果{x,y}属于一个子集,它们必然连通,且权值相同,权值为0或1。
   (2)如果{x,y}不属于一个子集,它们要么是相邻的两个不同权值的子集,要么它们之间的路径穿过了一个不同权值的子集,两种情况下的路径上有1也有0。
   以上讨论的实际上是并查集的操作。下面用带路径压缩的并查集编码,一次查询约为O(1),m次查询的总复杂度约为O(m)。。
【笔记】

C++代码

  

#include<bits/stdc++.h>
using namespace std;
char str[100010];
int s[100010];  //并查集
int find_set(int x){                    //查询并查集,返回x的根if(x != s[x]) s[x] = find_set(s[x]);     //路径压缩return s[x];
}
void merge_set(int x, int y){           //合并x = find_set(x);   y = find_set(y);if(x != y)    s[x] = s[y];          //把x合并到y上,y的根成为x的根
}
int main(){int n, m;scanf("%d %d",&n,&m);scanf("%s",str+1);for(int i = 1; i <= n; i++)  s[i] = i;    //并查集初始化for(int i = 1; i < n; i++){int u, v;    scanf("%d %d",&u,&v);if(str[u] == str[v]) merge_set(u,v);  //合并}for(int i = 1; i <= m; i++){int x, y;  char k;    scanf("%d %d %c",&x,&y,&k);if(find_set(x) == find_set(y) && str[x] != k) //属于同一个子集,且权值不等于kputs("No");   //比cout快else                           //其他情况,既有0也有1puts("Yes");  //比cout快}return 0;
}

Java代码

import java.util.Scanner;
public class Main {static char[] str = new char[100010];static int[] s = new int[100010];static int findSet(int x) {if (x != s[x])       s[x] = findSet(s[x]);return s[x];}static void mergeSet(int x, int y) {x = findSet(x);y = findSet(y);if (x != y)      s[x] = s[y];}public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int m = sc.nextInt();String strInput = sc.next();strInput.getChars(0, strInput.length(), str, 1);for (int i = 1; i <= n; i++)    s[i] = i;for (int i = 1; i < n; i++) {int u = sc.nextInt();int v = sc.nextInt();if (str[u] == str[v])   mergeSet(u, v);}for (int i = 1; i <= m; i++) {int x = sc.nextInt();int y = sc.nextInt();char k = sc.next().charAt(0);if (findSet(x) == findSet(y) && str[x] != k)   System.out.println("No");else     System.out.println("Yes");}}
}

Python代码

import sys
sys.setrecursionlimit(1000000)    #注意要扩栈
str = [0] * 100010
s = [0] * 100010
def find_set(x):if x != s[x]:    s[x] = find_set(s[x])return s[x]
def merge_set(x, y):x = find_set(x)y = find_set(y)if x != y:   s[x] = s[y]
n, m = map(int, input().split())
str[1:n+1] = input()
for i in range(1, n+1):  s[i] = i
for i in range(n-1):u, v = map(int, input().split())if str[u] == str[v]:  merge_set(u, v)
for i in range(m):x, y, k = input().split()x = int(x)y = int(y)if find_set(x) == find_set(y) and str[x] != k:   print("No")else:     print("Yes")

相关文章:

《算法竞赛·快冲300题》每日一题:“01树”

《算法竞赛快冲300题》将于2024年出版&#xff0c;是《算法竞赛》的辅助练习册。 所有题目放在自建的OJ New Online Judge。 用C/C、Java、Python三种语言给出代码&#xff0c;以中低档题为主&#xff0c;适合入门、进阶。 文章目录 题目描述题解C代码Java代码Python代码 “ 0…...

Mac提示文件:已损坏,无法打开。你应该把它移到废纸篓

文章目录 一、电脑信息二、打开任何来源设置三、更改应用程序拓展属性 一、电脑信息 我的是新版的Venture 13的系统。UI改的比较多。与之前的配置还是有很大的区别的。 打开下载的软件&#xff0c;显示已经损坏&#xff0c;打不开。抛开软件本身的问题外&#xff0c;一般是Ma…...

探索嵌入式系统:从入门到实践

随着科技的飞速发展&#xff0c;嵌入式系统已经成为了我们生活中不可或缺的一部分。从智能手机、智能家居到工业自动化设备&#xff0c;嵌入式系统的应用已经渗透到了各个领域。那么&#xff0c;如何学习嵌入式系统呢&#xff1f;本文将从入门到实践&#xff0c;为你详细解答。…...

网络安全知识点整理(作业2)

目录 一、js函数声明->function 第一种 第二种 第三种 二、this关键字 this使用场合 1.全局环境 2.构造函数 3.对象的方法 避免多层this 三、js的同步与异步 定时器 setTimeout和setInterval 同步与异步的例子 四、宏任务与微任务 分辨宏任务与微任务 一、js…...

idea数据库快速上手-库操作与表结构和数据操作

引言 对数据库的操作无非就是执行SQL语句&#xff0c;要想熟练操作数据库&#xff0c;就要熟练运用SQL语句。 一&#xff0c;数据库操作 展示当前服务器内的数据库 -- 展示服务器内的数据库 show databases; show schemas; 执行结果&#xff1a; 创建数据库&#xff1a; --…...

当“国潮”遇见“双语” 以传承之心种下一颗文化的种子

看&#xff0c;活灵活现的纸片人在“跳舞”。光影的辉映下&#xff0c;两个形神兼备的“齐天大圣”究竟孰真孰假&#xff1f;舞台上&#xff0c;京西皮影非遗传承人王熙和5岁的Mona小朋友正在用双语为大家带来一段“真假美猴王”的好戏。生动的皮影造型和精彩的故事演绎看得台下…...

计划管理与项目管理:有何区别?

简而言之&#xff0c;是的。尽管它们经常互换使用并对全局产生影响&#xff0c;但它们是完全不同的。 在本文中&#xff0c;我们将了解计划和项目管理之间的差异&#xff0c;提供每个示例&#xff0c;并向您展示如何使计划和项目管理工作更有效地实现您的业务目标。 计划管理与…...

个人信息保护合规审计如何做?

8月3日&#xff0c;为指导、规范个人信息保护合规审计活动&#xff0c;根据《中华人民共和国个人信息保护法》等法律法规&#xff0c;国家互联网信息办公室就《个人信息保护合规审计管理办法&#xff08;征求意见稿&#xff09;》&#xff08;简称《办法》&#xff09;及配套的…...

HTTP杂谈之Referer和Origin请求头再探

一 关于Referer和Origin的汇总 1) 知识是凌乱的,各位看官看个热闹即可2) 内容不断更新1、理解有盲区,需要及时纠正2、内容交叉有重复,需要适当删减3、扩展视野3) 以下内容都与Referer和Origin请求头有关联 nginx防盗链 HTTP杂谈之Referrer-Policy响应头 iframe标签referre…...

数学建模-爬虫入门

Python快速入门 简单易懂Python入门 爬虫流程 获取网页内容&#xff1a;HTTP请求解析网页内容&#xff1a;Requst库、HTML结果、Beautiful Soup库储存和分析数据 什么是HTTP请求和响应 如何用Python Requests发送请求 下载pip macos系统下载&#xff1a;pip3 install req…...

HSRM各表

文章目录 表规则接口种类服务与网关路由菜单一、采购申请1、采购申请—查询2、采购申请-操作记录二、采购申请跟踪报表1、采购申请跟踪报表—列表查询三、寻源1、寻源大厅—列表查询2、寻源大厅—询价单明细3、寻源大厅—物料明细4、寻源大厅—供应商列表5、寻源模板—列表查询…...

Ansible自动化运维工具 —— Playbook 剧本

playbooks 本身由以下各部分组成 &#xff08;1&#xff09;Tasks&#xff1a;任务&#xff0c;即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行 &#xff08;2&#xff09;Variables&#xff1a;变量 &#xff08;3&#xff09;Templates&#xff1a;模…...

第二章:多态

系列文章目录 文章目录 系列文章目录前言多态的概念概念 多态的定义及实现多态的构成条件虚函数虚函数的重写C11 override 和 final重载、覆盖(重写)、隐藏(重定义)的对比 抽象类概念接口继承和实现继承 多态的原理虚函数表多态的原理动态绑定与静态绑定 单继承和多继承关系的虚…...

C++面向对象设计基础

一般类、&、const、模板、友元函数、操作符重载基本用法及实现 complex.h #ifndef COMPLEX_H #define COMPLEX_H #include<ostream> using namespace std;template<typename T> class Complex{public:Complex():re(0),img(0){}// 为什么构造函数不能传引用&a…...

Linux定时运行sh脚本,如果sh文件已经在运行,则忽略本次运行

需求来源 我需要linux的crontab定期每10分钟运行lan.sh脚本。但由于lan.sh运行需要较长时间&#xff0c;有时超过10分钟。这样会导致系统多次运行lan.sh脚本&#xff0c;引发运行堆积&#xff0c;导致一些非必要的错误。 解决方法 解决方法是写一个脚本&#xff0c;如果lan.…...

SpringBoot项目中的web安全防护

最近这个月公司对项目进行了几次安全性扫描&#xff0c;然后扫描出来了一些安全漏洞&#xff0c;所以最近也一直在修复各种安全漏洞&#xff0c;还有就是最近在备考软考高级系统架构设计师&#xff0c;也刚好复习到了网络安全这一个章节&#xff0c;顺便将最近修复的安全漏洞总…...

stm32和python串口数据收发

1-1 串口发送端&#xff08;stm32&#xff09; 1字符串发送 void USART_SendData(USART_TypeDef* USARTx, uint16_t Data) {/* Check the parameters */assert_param(IS_USART_ALL_PERIPH(USARTx));assert_param(IS_USART_DATA(Data)); /* Transmit Data */USARTx->DR (D…...

无涯教程-jQuery - Dropable移动函数

Drop-able 功能可与JqueryUI中的交互一起使用。此功能可在任何DOM元素上启用可放置功能。 Drop able - 语法 $( "#droppable" ).droppable(); Drop able - 示例 以下是一个简单的示例&#xff0c;显示了drop-able的用法- <html><head><title>…...

【Python】Web学习笔记_flask(4)——钩子函数

钩子函数可以用来注册在请求处理的不同阶段执行出 Flask的请求钩子指的是在执行视图函数前后执行的一些函数&#xff0c; 之前是有4种&#xff0c;但是 before_first_request已经被删除了&#xff0c;使用时会报错 before_request&#xff1a;在每次请求前执行&#xff0c;…...

JavaScript 原型链解析,宏任务和微任务

目录 什么是原型链&#xff1f; 原型与构造函数 原型链的工作原理 实例&#xff1a;理解原型链 宏任务&#xff08;Macro Task&#xff09; 微任务&#xff08;Micro Task&#xff09; 什么是原型链&#xff1f; JavaScript 是一门基于原型的语言&#xff0c;而原型链是…...

怎样5分钟完成图片转3D打印:ImageToSTL开源工具高效指南

怎样5分钟完成图片转3D打印&#xff1a;ImageToSTL开源工具高效指南 【免费下载链接】ImageToSTL This tool allows you to easily convert any image into a 3D print-ready STL model. The surface of the model will display the image when illuminated from the left side…...

数据库基础概念与体系结构 - 软考备战(二十九)

数据库系统&#xff08;一&#xff09; 参考资料&#xff1a; 终于有人把数据库讲明白了 - 数据集成与治理 - 博客园 数据库基础知识总结 | JavaGuide 一文读懂数据库中的DB、DBMS、DBS、DBAS-云社区-华为云 数据库&#xff08;一&#xff09;&#xff1a;三级模式与两级映…...

GRBL移植实战(一):从AVR到ARM的引脚映射与平台适配

1. GRBL移植前的准备工作 第一次接触GRBL移植的朋友可能会觉得无从下手&#xff0c;毕竟要把一个成熟的运动控制系统从AVR平台搬到ARM架构上&#xff0c;听起来就像是要把一辆老爷车的发动机装进新能源车里。但别担心&#xff0c;我去年刚完成了一个从Atmega328p到STM32F407的…...

常用运放电路

一&#xff1a;运放核心基础1.核心定律虚断&#xff1a;运放两个输入端的输入电流≈0&#xff08;相当于开路&#xff0c;电流只走反馈电阻&#xff09;。虚短&#xff1a;运放线性区&#xff08;有负反馈&#xff09;时&#xff0c;同相端电压≈反相端电压&#xff08;V V-&a…...

基于STM32Cube MX的CAN总线高效配置实战:从HAL库初始化到多节点通信调试

1. CAN总线与STM32Cube MX基础认知 第一次接触CAN总线时&#xff0c;我也被它复杂的协议栈吓到过。但实际在工业控制领域&#xff0c;CAN总线就像老司机们心照不宣的暗号——用两根线就能搞定多设备通信。我的第一个CAN项目是给智能农业大棚做环境监控&#xff0c;当时用STM32F…...

图像压缩ONNX模型跨平台推理一致性问题解决方案

图像压缩ONNX模型跨平台推理一致性问题解决方案 摘要 随着深度学习技术的快速发展,基于学习型图像压缩(Learned Image Compression, LIC)算法在压缩效率上已超越传统图像编码技术,逐渐向工业应用迈进。然而,在实际部署过程中,一个关键问题凸显出来:非确定性计算导致概…...

可跑在STM32上的EtherCAT主机协议栈

主流分开源轻量栈与商业高性能栈两类一、开源协议栈&#xff08;免费、商用友好、STM32最常用&#xff09; 1. SOEM&#xff08;Simple Open EtherCAT Master&#xff09; 授权&#xff1a;BSD 2-Clause&#xff08;商用闭源友好&#xff0c;无衍生开源要求&#xff09;资源&am…...

中级Python开发-FluentPython-1

一、为什么 Fluent Python 的开篇值得反复看? 很多人学 Python 的路径是: 学语法 背常用库 刷题/写脚本 但中高级 Python 工程师真正的分水岭,不在语法熟练度,而在是否理解 Python 的“协议式设计”: 你写的类是否能 len(obj)? 是否支持索引与切片 obj[i], obj[:3]? 是…...

3分钟!玩转游戏下载站系统!蜘蛛池seo功能完善部署!

从复杂的建站流程到全自动部署游戏站下载站养站系统&#xff0c;整个流程只要3分钟&#xff01;养站系统中的每个网站URL路径有2000 0000 0000条&#xff01;&#xff08;不需要发文章&#xff0c;自动更新文章&#xff0c;解决seo站长文章问题&#xff09;游戏站养站功能简述&…...

Calibre中文路径管理技术:原生Unicode支持与路径转换解决方案

Calibre中文路径管理技术&#xff1a;原生Unicode支持与路径转换解决方案 【免费下载链接】calibre-do-not-translate-my-path Switch my calibre library from ascii path to plain Unicode path. 将我的书库从拼音目录切换至非纯英文&#xff08;中文&#xff09;命名 项目…...