UVA12232 Exclusive-OR

news/2025/4/2 23:18:59/文章来源:https://www.cnblogs.com/purple123/p/18804298

原题链接:UVA12232 Exclusive-OR - 洛谷 或者 Exclusive-OR - UVA 12232 - Virtual Judge

题解:

带权并查集处理异或运算。

首先,对于第二种情况,I a b v 我们可以将a,b连起来形成一个并查集,同时用一个value数组存储当前节点异或头节点的 的值,此时我们关注的就是不同头节点连接时value数组的更新。

我们思考此时有个一条输入 I a b v ;a 对应的头节点为La,b对应头节点为Lb,假设La挂到Lb上,则

value[La]=value[a]^value[b]^v=a^La ^ b^Lb ^ a^b = La^Lb

这时我们就推出了不同集合之间的更新关系。

接着,我们处理赋值情况,显而易见的是,当一个集合内的一个值确定,那么集合内的其他值都确定(因为我们知道他们的异或关系),这里只需要设置一个虚拟节点即可。

最后,查询过程,如果此时读入一个虚拟节点内的值,那么我们知晓其确切的值,无需处理;但是如果读入的是其余集合内的值,假设为 ai 那么我们只能知晓 ai^fa[ai] 的值,我们不难发现要利用当前集合内的另一个值将fa[ai]的影响消除。

因此,我们得到结论,虚拟节点集合内直接取出对应value,其余集合内要取偶数个才能得到答案。得解。

PS:这道题输出有点坑,首先 I don't know. 中 ‘ 得是英文状态下的;其次,每一组输出后面要额外多一行空行。

code:

#include<bits/stdc++.h>
using namespace std;
const int N=2e4+5;
int fa[N],value[N];
int n,q,t=0;int find_dsu(int tree){if (tree!=fa[tree]){int t=fa[tree];fa[tree]=find_dsu(t);value[tree]^=value[t];}return fa[tree];
}void union_dsu(int l,int r,int v){int lf=find_dsu(l),rf=find_dsu(r);if (lf==n){fa[rf]=n;value[rf]=(value[l]^value[r]^v);
//        cout<<rf<<" "<<value[l]<<" "<<value[r]<<" "<<v<<"\n";return;}if (rf==n){fa[lf]=n;value[lf]=(value[l]^value[r]^v);return;}fa[lf]=rf;value[lf]=(value[l]^value[r]^v);
}int main(){
//    freopen("input.txt","r",stdin);string s;while (cin>>n>>q){if (n==0 && q==0) break;cout<<"Case "<<++t<<":\n";for (int i=0;i<=n;i++){fa[i]=i;value[i]=0;}int now_q=0;bool is_print=true;while(q--){cin>>s;if (s[0]=='I'){getline(cin,s);s=s+" ";int cnt_s=s.size();now_q++;int a[3]={0,0,0},l=0;for (int i=1;i<cnt_s;i++){if (s[i]==' '){l++;}else{a[l]=a[l]*10+s[i]-'0';}}//                for (int i=0;i<l;i++) cout<<a[i]<<" ";
//                cout<<"\n";if (l==2){int f=find_dsu(a[0]);if (f!=n) union_dsu(n,a[0],a[1]);else if (value[a[0]]!=a[1]){cout<<"The first "<<now_q<<" facts are conflicting.\n";is_print=false;}}else{int lf=find_dsu(a[0]),rf=find_dsu(a[1]);if (lf!=rf) union_dsu(a[0],a[1],a[2]);else if ((value[a[0]]^value[a[1]])!=a[2]){cout<<"The first "<<now_q<<" facts are conflicting.\n";is_print=false;}}}else{//                for (int i=0;i<=n;i++){
//                    cout<<i<<" "<<fa[i]<<" "<<value[i]<<"\n";
//                }int k;cin>>k;int ans=0;int now;map<int ,int > num;for (int i=1;i<=k;i++){cin>>now;int f=find_dsu(now);if (f!=n) num[f]++;ans^=value[now];}if (is_print==false) continue;bool bol=true;for (auto it : num){if (it.second%2) bol=false;}if (bol) cout<<ans<<"\n";else cout<<"I don't know.\n";}            }cout<<"\n";}return 0;
}

 

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

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

相关文章

算法备案没产品可以申请吗?

算法备案复审阶段涉及产品信息填报,所以一度让一些开发者有这样的错误认知:只有等产品要上线了,才能火急火燎地去申请算法备案。但这个观点其实是错误的,其实开发者也可以在没有具体产品的情况下发起算法备案申请。只要材料合法合规,也能取得备案号。下面是一些具体信息介…

工业通信协议“牵手密码”,Ethernet IP转Profinet网关的桥梁魔法

在当前工业自动化领域,实时以太网技术已经成为至关重要的通信标准之一。Profinet和EtherNetIP作为两种广泛采用的实时以太网协议,各自拥有其独特的性能优势和适用场景。本文旨在探讨稳联技术Profinet转EtherNetIP网关WL-PN-EIPM的功能,并评估其在节能实施与监测方面的应用价…

LeetCode刷题-动态规划-爬楼梯

LeetCode刷题-动态规划-爬楼梯 题目: 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n = 2 输出:2 解释:有两种方法可以爬到楼顶。1 阶 + 1 阶 2 阶 示例 2:输入:n = 3 输出:3 解释:有…

【攻防世界】Hidden-Message

⭕、知识点 流量分析/端口号隐写/tshark/json文件处理 一、题目二、解法 1、端口号个位呈现有规律的01交替,可能隐藏信息。 2、为便于提取信息,使用kali的tshark对其进行转存 tshark -r input.pcap -T json > output.txt注意在使用tshark时应避免使用root账户 否则会出现如…

022 props组件交互

.vue 的文件,就是一个组件,每个.vue 文件就是每个页面html 的时候,每个页面都是一个 htmlvue2 和 vue3 的生命周期钩子是不同的components:常用的组件,公共的组件views:用来存放页面的新建项目,删除HelloWorld.vue components也删除views删除 这个index.js删除 这两页面…

客户端打开BI报表提示 Your current browser is not supported”

win7的打开会报这个问题, win11可以正常打开, 应该是环境差异导致。

Linux-常用命令(3)

Linux-常用命令(3)Linux常用命令 查看文件 cat命令 cat命令可以创建一个或者多个文件、查看文件内容、连接文件,常用于查看文件内容 cat 文件名 //显示文件内容 cat -n 文件名 //显示文件内容,并显示行号 cat - 文件名 //显示文件内容(包括不可见字符)系统时间 date命令…

【EI】机器人与传感器网络国际会议(RoSeN 2025)

第一届机器人与传感器网络国际会议(RoSeN 2025)将于2025年5月16-18日在贵阳举行,会议将围绕机器人展开的在机器人、人机交互、传感、智能控制等相关研究领域,邀请国内外数位在此领域学术卓越的学者专家做相关致辞与报告,共同探讨机器人发展最新发展方向及行业前沿动态。会…

[转]玩客云刷armbian后根目录扩展

地址:玩客云刷armbian后根目录扩展_IT码迹最近拼夕夕搞了个玩客云,自己懒得刷机(太麻烦,还要绝育什么的)所以直接买的刷好的,商家送了个U盘32G已经做好了镜像。 商家镜像刷了不少东西除了openwrt,其他几个docker镜像都是armbian比较好用的。不过在我要安装其他插件的时候发…

生成未来:解码智能技术驱动的产业革命

在人工智能浪潮的推动下,AI生图与视频技术正以惊人的速度重塑人类的生产方式。从一张图片的生成到一段视频的秒级渲染,技术的突破不仅解放了生产力,更催生了全新的商业生态。这场变革的核心,在于用算法替代重复劳动,以智能激发无限创意,而这一切仅仅是开端。 一、技术突破…

云终端远程自动调用开关机功能

云桌面项目由于缺少一键关机和开机功能,通过Linux实现自动化调用开机和关机 1、收集所有终端信息的MAC地址收集方式可以采用ipscan25.exe也可以通过cmd下arp -a方式收集MAC地址,同时记录MAC可以IP地址的对应关系。2、所有终端安装openssh使用系统自带或者下载OpenSSH-Win64-v…