[HDU 3234] Exclusive-OR

本文介绍使用带路径压缩的并查集解决HDU 3234题的方法,通过记录节点到父节点的XOR值处理题目中的信息更新和查询操作。

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

一、题目描述

http://acm.hdu.edu.cn/showproblem.php?pid=3234

存在n个正数。

题目逐渐给出信息或询问。

题图

要求处理。

如果中途出现冲突,输出有冲突,其余语句全部忽略。

详见原题。

 

二、准备知识

对于a,b,c有:a xor b == c 和 a xor c == b 和 b xor c == a 等价

 

二、题目分析

首先可以想到这是比较经典的并查集模型,不过并不是赤裸裸的,有一些细节需要考虑。

利用带路径压缩的并查集模型,同时记录节点到其父节点的xor值。

father[i]记录父节点,offxor[i]记录节点到父节点的xor值, value[i]记录数值大小

一些细节,很多细节可以通过画图看出,一图胜千言:

1、在处理I p v或者I p q v时,set_value的时候处理根节点的value。因为之后很多东西都要用到根的value值,或是判断根节点的value是否存在。

2、处理Q,即处理询问时。记录p1 p2 ... pk的根和每个根出现的次数。如果出现的次数是奇数次,那么就需要用到根的value了。这样也可以判断是不是I don't know.

 

三、源代码

 

四、心得

1、memset(value, 255, sizeof (int) * N); 可以利用255将数组初始化为-1,以后不用写for初始化为-1了

2、"#include <sstream>" + "gets(in_str);" + "int t = sscanf(in_str, "%d%d%d", &p, &q, &v);"

    可以很好处理这道题之类I类型不知道后面要读几个数字的问题。先把字符串读进来,然后用sscanf从字符串中读取数字,利用其返回值就知道读到几个数字了。sscanf还有其他很多功能,抛砖引玉,以后再有需要就多了一个可以寻找的方向了。

3、又PE了一次,以后一定要看清楚每组数据之间是否要输出空行,不管Sample Output里头有没有。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值