AtCoder Beginner Contest 396-e

news/2025/3/9 20:43:35/文章来源:https://www.cnblogs.com/CMY2013/p/18761343

原题链接

思路

看到这道题,很明显就能发现这道题其实跟图论有关,将\(A\)数组看成一张无向图,每一个节点\(i\)的点权就是\(A_i\),每两个节点\(i\)\(j\)之间的边权就是\(A_i \oplus A_j\)。而我们可以枚举答案的每一个比特位,用BFS(或DFS,作者这里用的是BFS)来维护每一个连通块(因为只有连通块中的节点会相互影响),如果任意一个连通块中的节点发生了矛盾,则直接输出\(-1\)(因为只要有一个比特位不符合,所有答案就会有错误),并将程序结束。否则如果所有的节点都满足条件,则将答案记录下来,并在最后输出。

CODE

#include<iostream>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
int n,m,x[100010],y[100010],z[100010],zy[200010],tp[200010];
vector<pair<int,int> >vec[200010];
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n>>m;for(int i=1;i<=m;i++) {cin>>x[i]>>y[i]>>z[i]; //输入vec[x[i]].push_back(make_pair(y[i],z[i])); //建无向边vec[y[i]].push_back(make_pair(x[i],z[i]));}for(int i=0;i<=30;i++) //枚举每一个比特位,因为10的9次方小于2的31次方,所以只用枚举31位就够了{memset(tp,-1,sizeof(tp)); //初始化标记数组,因为比特位的两种情况分别为0和1,所以只能初始化为-1for(int j=1;j<=n;j++){if(tp[j]!=-1) continue; //如果在一个连通块中,则跳过这个节点vector<int> ls;queue<int> q;tp[j]=0;q.push(j);while(!q.empty()){int l=q.front();q.pop();ls.push_back(l);for(auto eg:vec[l]) //遍历每条边{int v=eg.first,w=eg.second;if(tp[v]==-1)	//如果没有初始值{tp[v]=((w>>i)&1)^tp[l]; //赋初始值q.push(v); //BFS}else {if(tp[v]!=((w>>i)&1)^tp[l]) //不符合条件{cout<<-1; return 0; //结束程序}}}}int cnt=0;for(auto v:ls) if(tp[v]==1) cnt++;if(cnt>ls.size()-cnt) for(auto v:ls) tp[v]=1-tp[v]; //这样做是因为这个图是一个无向图,会有两种相反的答案,而题目要求A数组总和最小,所以我们要让比特位上的1最少才能使答案最小for(auto v:ls) if(tp[v]==1) zy[v]|=(1<<i); //更新答案}}for(int i=1;i<=n;i++) cout<<zy[i]<<' '; //输出答案return 0;
}

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

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

相关文章

p44太阳花

from turtle import * color(red, yellow) begin_fill() while Ture:forward(200)left(170)if abs(pos()) < 1:break end_fill() done()

基于IEKF迭代扩展卡尔曼滤波算法的数据跟踪matlab仿真,对比EKF和UKF

1.程序功能描述 基于IEKF迭代扩展卡尔曼滤波算法的数据跟踪matlab仿真,对比EKF和UKF.仿真输出误差收敛曲线和误差协方差收敛曲线。 2.测试软件版本以及运行结果展示MATLAB2022A版本运行 (完整程序运行后无水印) 3.核心程序for i=1:Lekf-1z =…

Winform控件命名规则

C#控件命名规范控件分类控件名称命名规范说明数据显示控件DataGridViewdgv 数据绑定和定位控件BindingSourcebds BindingNavigatorbdn 文本编辑控件TextBoxtxt RichTextBoxrtxt MaskedTextBoxmtxt 信息显示控件Labellbl LinkLabelllbl StatusTripst ProgressBarpb 网页显示控件…

VMware中三种网络的区别

目录桥接模式仅主机模式NAT网络模式 桥接模式桥接模式 在Linux中,桥接模式通常指的是网络桥接(Network Bridging),它是一种将多个网络接口连接在一起的技术,形成一个局域网(LAN),使它们能够像在同一个网络中一样通信。仅主机模式仅主机网络 在仅主机模式下,虚拟网络是…

UE5之使用C++显示瞄准准星

1.创建控件蓝图 首先右键 用户界面---控件蓝图,创建一个控件蓝图CrosshairWidget,默认继承自UserWidget。在CrosshairWidget中新建一个Canvas Panel,再创建一个Image,加入准星图像并设置位置居中,这样准星的UI就完成了。 再添加一个图像,将其绘制为圆形盒体,这样就得到了…

20242802 2024-2025-2 《网络攻防实践》第二周作业

20242802 2024-2025-2 《网络攻防实践》第二周作业 目录 目录20242802 2024-2025-2 《网络攻防实践》第二周作业1. 实验要求2. 实验相关知识点nmap工具使用3. 实验详细过程3.1 从www.besti.edu.cn、baidu.com、sina.com.cn中选择一个DNS域名进行查询,获取如下信息:3.2尝试获取…

UE5之瞄准视角的俯仰偏移

1.创建瞄准姿势 复制瞄准动画,删除其中多余的帧,只保留瞄准的一帧,将其创建为一个单帧动画。然后将其复制成三份,分别用于表示瞄准三个姿势的up,middle,down。 将middle姿势动画的Additive动画类型修改为网格体空间,因为我们需要在网格空间创建叠加动画。基础姿势修改为…

2K star!三分钟搭建企业级后台系统,这款开源Java框架绝了!

"LikeAdmin Java是基于Spring Boot + Mybatis Plus + Vue 3的快速开发平台,内置RBAC权限管理、工作流引擎、数据可视化、三方登录等核心模块,助力开发者快速构建企业级中后台管理系统"2K star!三分钟搭建企业级后台系统,这款开源Java框架绝了!"LikeAdmin J…

震惊!C++程序真的从main开始吗?99%的程序员都答错了

嘿,朋友们好啊!我是小康。今天咱们来聊一个看似简单,但实际上99%的C++程序员都答错的问题:C++程序真的是从main函数开始执行的吗? 如果你毫不犹豫地回答"是",那恭喜你,你和大多数人一样——掉进了C++的第一个陷阱!别担心,等你看完这篇文章,你就能成为那个与…

11套!量产15W~1000W开关电源电路全套方案资料合集!

本系列小编给大家带来了15W到1000W完整量产版开关电源全系列,全套资料分期给大家分享。每套资料都包含详细的原理图,PCB图,变压器图纸,共模电感图纸,磁环图纸!点击下方链接获取! 15W开关电源方案👆👆👆(点击下载) 25W开关电源方案👆👆👆(点击下载) 30W开…

【每日一题】20250309

我所渴望的,不过是过上一种发自本心的生活,为什么竟会如此困难?【每日一题】已知 \(\odot C\) 过点 \(P(1,2)\),与 \(y\) 轴相交于点 \(Q(0,6)\).若过点 \(Q\) 作 \(\odot C\) 的切线 \(l\),其切线 \(l\) 与 \(x\) 轴平行,则 \(l\) 的方程为_________,\(\odot C\) 的标…