NKOJ 3762 守夜人 (并查集)

博客介绍了如何使用并查集解决NKOJ 3762 守夜人问题,包括问题描述、输入输出格式、样例输入输出,以及解题思路和操作处理。解题关键在于利用异或运算性质,通过路径压缩和合并操作更新并查集,并在处理询问时快速计算异或值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

P3762守夜人

问题描述

鉴于john snow当选了新的守夜人总司令,艾里沙爵士感觉非常不爽,想搞点事情来难倒snow。艾里沙爵士告诉你有一个n项的序列X0,X1,X2…..Xn-1。(其中每一项均在int范围之内)但是你现在不知道其中的任何一项。艾里沙会逐步的告诉你一些信息并且问你一些问题。共有两种类型的信息和一种类型的询问。

I p v : 告诉你 Xp = v

I p q v : 告诉你 Xp XOR Xq = v

Q k p1 p2 … pk : 询问Xp1 XOR Xp2 XOR … XOR Xpk的值 k≤15

输入格式

会有多组测试数据但不会超过10组。
每一组数据以两个整数开始:n , Q(1 ≤ n ≤ 20, 000, 2 ≤ Q ≤ 40, 000)题目描述中的k是一个不大于15的整数。
最后一组数据为n==Q==0,不用进行运算。

输出格式

对于每组数据,输出第一行为数据的组数,接下来的每一行对应一次询问的答案。
如果根据前面给出的信息无法算出答案,则输出“I don’t know.”。
如果与已知信息冲突,输出“The first i facts are conflicting.”,并结束对于这一组数据的运算,其中i为这组数据出现过的的信息条数(不含询问,包含当前这一条信息)。

样例输入

2 6
I 0 1 3
Q 1 0
Q 2 1 0
I 0 2
Q 1 1
Q 1 0
3 3
I 0 1 6
I 0 2 2
Q 2 1 2
2 4
I 0 1 7
Q 2 0 1
I 0 1 8
Q 2 0 1
0 0

样例输出

Case 1:
I don’t know.
3
1
2
Case 2:
4
Case 3:
7
The first 2 facts are conflicting.

提示

注释:
鉴于两种I操作的输入比较麻烦,这里给出一种参考输入方法:
gets(s);
if(sscanf(s,”%d%d%d”,&a,&b,&v)==2)
//这一行输入了两个整数,要先除去行首的字母,具体可参考代码


这题显然是带权并查集,用 D[i] 来记录下 i 和的他父亲的异或值。考虑如何处理三个操作。

先处理路径压缩,假设fx是x的父亲,ffx是fx的父亲,由异或运算的特性可知x^ffx=x^fx^fx^ffx=D[x]^D[fx],所以路径压缩就解决了。

关于“守夜人”的具体Python代码示例并没有直接关联的标准库或常见框架中的实现。然而,如果设想一个名为“守夜人”的功能模块,比如用于监控夜间服务器状态的应用,则可以根据需求编写相应脚本。 假设创建一个简单的命令行工具作为“守夜人”,它会在特定时间段内定期检查某些服务的状态并记录日志: ```python import time from datetime import datetime class NightWatcher: """模拟‘守夜人’角色的服务监测类""" def __init__(self, start_hour=20, end_hour=6): # 定义工作时间范围 """ 初始化NightWatcher实例 参数: start_hour (int): 开始工作的小时数,默认晚上8点. end_hour (int): 结束工作的小时数,默认早上6点. """ def check_service_status(self): """模拟检查服务状态的方法""" now = datetime.now() current_time = now.strftime("%H:%M:%S") print(f"[{current_time}] 正在检查...一切正常") def run(self): while True: now = datetime.now().time() if self.start_hour <= now.hour or now.hour < self.end_hour: self.check_service_status() else: print("不在工作时间内...") time.sleep(3600) # 每隔一个小时检查一次 if __name__ == "__main__": watcher = NightWatcher(start_hour=20, end_hour=6) try: watcher.run() except KeyboardInterrupt: print("\n停止了守夜人的任务.") ``` 此段代码展示了如何构建一个基本的定时任务处理器,它可以按照设定的时间间隔执行给定的任务,在这里是指令式的打印消息表示正在监视系统状况。当然实际应用中可能涉及到更复杂的逻辑如网络请求、数据库查询等操作[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值