位运算相关

news2024/12/28 17:47:56

1.与运算
(点我)
这个题的大概意思:给 2 2 2个数 n n n x x x,其中满足 n & ( n + 1 ) & ( n + 2 ) & ( n + 3 ) . . . & m = x n\&(n+1)\&(n+2)\&(n+3)...\&m=x n&(n+1)&(n+2)&(n+3)...&m=x,求最小的 m m m,只要满足 m > = x m>=x m>=x即可
这个题在二进制的角度来看就是假设 n n n的位是

100101

那么 x x x一定是从某一位开始与 n n n不同,并且不同的这一位(记为 q q q位)一定是 x x x 0 0 0 n n n 1 1 1;并且从这一位往右 x x x的位都是 0 0 0.只有这样才是满足条件的,假设不是这样。

  • 情况一: x x x q q q位是为 1 1 1 n n n的为 0 0 0:一定不可能。与运算不可能弄出来一个 1 1 1
  • 情况2: x x x q q q位往右还有 1 1 1:一定不可能。既然 x x x是累积与运算的结果,那么与到 q q q位一定是用一个   \space   q + 1 q+1 q+1位(向左数1位)为 1 1 1后面都是 0 0 0的数   \space   与出来的。

综上所述, x x x的位可以是:

100100

在这里有一个 t r i c k trick trick n n n q + 1 q+1 q+1位为 1 1 1.这个 q + 1 q+1 q+1位(向左数1位)为 1 1 1后面都是 0 0 0的数 应该与 n n n q + 1 q+1 q+1位(含)相加(造出 m m m),但是如果 n n n q + 1 q+1 q+1位为 1 1 1,那么 q + 1 q+1 q+1位就会被消掉了。比如说 n = 3 n=3 n=3 x = 2 x=2 x=2最后求出来 m m m 4 4 4,结果是错的。证明略去。
代码:

#include<iostream>
#include<cstdio>
#include<bitset>
typedef long long ll;
using namespace std;
typedef long long ll;
int main(void)
{
	int t;
	scanf_s("%d", &t);
	for (int i = 0; i < t; i++)
	{
		ll n, x;
		scanf_s("%lld%lld", &n, &x);
		bitset<100> n2;
		bitset<100> x2;
		n2 = n;
		x2 = x;
		int flag = 1;
		for (int i = 99; i >= 0; i--)
		{
			 
			if (x2[i] != n2[i]&&x2[i]==1&&n2[i]==0)
			{
				flag = 0;
				break;
			}
			else if (x2[i] != n2[i])
			{
				if (x2[i + 1] == 1)
				{
					flag = 0;
					break;
				}
				for (int j = i - 1; j >= 0; j--)
				{
					if (x2[j] != 0)
					{
						flag = 0;
						break;
					}
				}
				if (flag == 0)
					break;
				x2[i + 1] = 1;
				break;
			}
		}
		if (flag == 0)
			printf("-1\n");
		else
		{
			ll sum = 0;
			for (int i = 99; i >= 0; i--)
			{
				sum = sum * 2 + x2[i];
			}
			printf("%lld\n", sum);
		}
	     	
	}
}

2.或运算
集合?(点我)
这个题的大概意思是给 n n n个数,然后每个数是以位的形式给出的,比如说第 i i i个数有 3 3 3位: 2 , 3 , 5 2,3,5 235 2 , 3 , 5 2,3,5 235位上是 1 1 1)那么第 i i i行的样例就会给出:

3 2 3 5

现在要找出两个子序列,让他们的或运算的结果相等。
我一开始想到集合上去了,就是把每个数的位加入到集合里面,然后看集合大小有没有变化,这个和加入顺序有很大关系,并且在某种程度是错误的:
比如说:

3 1 3 4
3 2 3 1
3 3 5 2

这个样例其实是正确的,但是每次加入集合都有新元素,所以算法不对。实际上只要记录下来所有数的位的出现次数,然后再看是否存在一个数的所有位出现次数 > 1 >1 >1即可。
数据结构:我之前交了个代码超时了,不是很理解 (用的 v e c t o r vector vector,所以统计次数的那个位置使用了 m a p map map

#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<map>
using namespace std;
//const int length = 2e5 + 5;
int main(void)
{
	int t;
	scanf_s("%d", &t);
	for (int i = 0; i < t; i++)
	{
		int n;
		scanf_s("%d", &n);
		vector<vector<int>> edge(n);
	//	vector<int> c(length, 0);
		map<int, int> c;
		for (int i = 0; i < n; i++)
		{
			int k;
			scanf_s("%d", &k);
			for (int j = 0; j< k; j++)
			{
				int a;
				scanf_s("%d", &a);
				edge[i].push_back(a);
				c[a]++;
			}
		}
		int flag = 0;
		for (int i = 0; i < n; i++)
		{
			int yh = 1;
			//for (int j = 0; j < edge[i].size(); j++)
			for(int j:edge[i])
			{
				if (c[j] == 1)
				{
					yh = 0;
					break;
				}
			}
			if (yh == 1)
			{
				flag = 1;
				break;
			}
		}
		if (flag)
			printf("YES\n");
		else
			printf("NO\n");
	}
}

![在这里插入图片描述](https://img-blog.csdnimg.cn/386d29b12bdb45f78ee52be52cfe1c9c.png

比较:
1840 m s 1840ms 1840ms是使用局部数组,在循环里用 m e m s e t memset memset
1855 m s 1855ms 1855ms那个用的全局数组,然后在循环里用 m e m s e t memset memset
超时的是把二维数组移到全局,然后在循环里声明一个 v e c t o r vector vector
93 m s 93ms 93ms是在循环里用 m a p map map
可能是开一个 v e c t o r vector vector比较花时间,本来就是险过,但是用 m a p map map就很快…

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【异常】java11提示: Cannot find any provider supporting RSA/ECB/PKCS1Padding的问题

一、背景 项目中需要对敏感字段进行加密&#xff0c;但是加密方法中涉及到比较复杂的加密算法&#xff0c;这些算法都需要一个Provider&#xff0c;主要是用于初始化算法的。 以下是遇到的具体问题 二、报错截图 java.security.NoSuchAlgorithmException: Cannot find any pr…

【软件测试】软件测试模型

1. V模型 需求分析—计划—设计—编码—测试 ● 概要设计&#xff1a;设计整体架构&#xff0c;框架 ● 详细设计&#xff1a;模块和模块之间的详细设计 ● 集成测试&#xff0c;单元测试&#xff1a;通常由开发人员进行 特点&#xff1a; 明确标注了测试的多类型明确标注了测…

Introduction to Multi-Armed Bandits——01 Scope and Motivation

Introduction to Multi-Armed Bandits——01 Scope and Motivation 参考资料 Slivkins A. Introduction to multi-armed bandits[J]. Foundations and Trends in Machine Learning, 2019, 12(1-2): 1-286.项目地址 https://github.com/yijunquan-afk/bandit-learning Bandit…

LeetCode622.设计循环队列

设计循环队列1.题目描述2.思路3.代码实现以及分析3.1 创建结构体3.2创建一个具体的循环队列3.3判断是否为空 和 判断是否为满4. 进队列 和 出队列5.取队首和队尾元素6.释放空间7.总结1.题目描述 设计循环队列 2.思路 环形队列的抽象图 我们这里使用数组模拟实现循环队列&…

TransactionTemplate自动注入,只看这一篇文章就够了

标准的springboot接入mybatis步骤 1.引入了对应的依赖包 2.应用的properties下增加相应配置 3.根据配置进行自动装配 一般我们会配置这些信息&#xff0c;主要包括三类 1.数据库的连接信息 2.指定的数据源类型 3.mybatis的配置信息 配完以后&#xff0c;当你启动SpringBoot的主…

你是真的“C”——详解C语言数组模块知识

详解C语言数组模块知识&#x1f60e;前言&#x1f64c;一维数组的创建和初始化&#x1f64c;1.1 数组的创建&#x1f49e;1.2 数组的初始化&#x1f49e;1.3 一维数组的使用&#x1f49e;1.4 一维数组在内存中的存储&#x1f49e;二维数组的创建和初始化&#x1f64c;1.1 二维数…

【Python百日进阶-数据分析】Day225 - plotly的Ohlc图go.Ohlc()

文章目录一、语法二、参数三、返回值四、实例4.1 简单的OHLC图4.2 隐藏滑块的OHLC图4.3 添加自定义文本和注释4.4 自定义OHLC颜色4.5 带日期时间对象的简单的OHLC图4.6 自定义悬浮文本4.7 Dash中的应用一、语法 ohlc&#xff08;Open-High-Low-Close 的缩写&#xff09;是一种…

【C++逆向】虚表(Virtual table)逆向 | 安卓so虚函数逆向

什么是多态 定义一个虚基类ISpeaker class ISpeaker{ protected:size_t b; public:ISpeaker( size_t _v ): b(_v) {}virtual void speak() 0; };有两个子类&#xff0c;都实现了虚函数speak()&#xff1a; class Dog : public ISpeaker { public:Dog(): ISpeaker(0){}//vir…

1581_AURIX_TC275_SMU故障处理梳理

全部学习汇总&#xff1a; GreyZhang/g_TC275: happy hacking for TC275! (github.com) 前面为了缓解自己的学习压力&#xff0c;一次学习笔记大概也就是看10页文档整理一下。这一次其实是看了几十页&#xff0c;但是里面过掉了一些信息&#xff0c;而且这部分内容不是很好拆分…

hive在IDEA中debug

一、hive在IDEA中debug 安装hadoop环境&#xff08;1和2替换顺序也可以&#xff09; 注&#xff1a;hadoop环境不需要从源码编译 https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.html 按照官网教程编译源码 https://cwiki.apach…

软件工程专业课实验报告

一、结构化分析方法1.1需求描述教务管理子系统的需求描述&#xff1a;教务管理是一项需求周密计划、严谨安排的工作&#xff0c;要依据教师、学生信息进行合理安排。开学阶段&#xff0c;需要教师提交开课申请进行开课&#xff0c;学生根据老师的开课信息&#xff0c;选择课程&…

uview 使用遇到的问题。

uviewuniappvue&#xff0c;uView是uni-app生态专用的UI框架。 1. 注意uview版本&#xff0c;uview 2.0与uview1.0 官方提示&#xff1a;uView2.0是继1.0以来的一次重大更新&#xff0c;2.0已全面兼容nvue。 因此在接手项目的时候首先得看清楚&#xff0c;之前开发的是uview…

【自学Python】Python获取字符串长度

Python获取字符串长度 Python获取字符串长度教程 在 Python 中要想获取 字符串 长度可以使用 len() 函数。 Python len()函数详解 定义 我们将要获取的字符串的长度&#xff0c;传进 len() 函数&#xff0c;即可实现获取字符串的长度。 语法 len(string)参数 参数描述s…

【7】K8s_Ingress | Service的统一网关入口

目录 1、Ingress简介 2、安装ingress 【1】制作ingress.yaml文件并执行 【2】测试&#xff0c;创建一个test.yaml文件并执行 【3】设置域名访问&#xff0c;用yaml文件 【4】路径重写 【5】流量限制 1、Ingress简介 Ingress: Service的统一网关入口是k8s中的一个api对象&…

时序数据库TDengine基本概念和建模思路

目录 一 、 时序数据库基本概念 采集量 标签 数据采集点 表 超级表 子表 库 二、 TDengine数据库建模策略 建表模式建表情形 行列数据库存储的区别&#xff1a; 接触的传统业务的数据模式都是行存储&#xff0c;我们会把不同类型的对象创建不同的表进行存储他们各自的属…

机器学习公式推导与代码实现-无监督学习模型

聚类分析与k均值聚类算法 督学习算法。在给定样本的情况下,聚类分析通过度量特征相似度或者距离,将样本自动划分为若干类别。 距离度量和相似度度量方式 距离度量和相似度度量是聚类分析的核心概念,大多数聚类算法建立在距离度量之上。常用的距离度量方式包括闵氏距离和马…

linux系统中使用QT来实现数据库的调用方法

大家好&#xff0c;今天主要和大家分享一下&#xff0c;如何使用QT中数据库的使用方法。 目录 第一&#xff1a;数据库基本简介 第二&#xff1a;数据库表格基本操作 第三&#xff1a;数据库最终效果 第一&#xff1a;数据库基本简介 数据库是按照数据结构来组织&#xff0c;…

视频目标检测与轨迹跟踪代码案例

前言通过阅读相关文献及测试&#xff0c;找到了一种基于多模板匹配的改进方法&#xff0c;可以对遥感视频卫星中的移动目标进行探测&#xff0c;并绘制其轨迹。根据实验结果发现&#xff0c;可以比较有效的对运动目标进行跟踪。一、原理核心思想比较简单。即通过不同旋转角度的…

AQS之ReentrantLock详解

非公平锁加锁过程一般我们在使用ReentrantLock的时候&#xff0c;代码如下&#xff1a;Test public void test(){ReentrantLock lock new ReentrantLock();lock.lock();try{//编写业务逻辑}catch (Exception e){lock.unlock();} }当我们在用ReentrantLock独占锁的时候&#xf…

current并发包

并发包 current并发包、在JDK1.5之前Java并没有提供线程安全的一些工具类去操作多线程&#xff0c;需要开发人员自行编写实现线程安全&#xff0c;但仍然无法完全避免低性能、死锁、资源管理等问题。在JDK1.5时新增了java.util.current并发包&#xff0c;其中提供了许多供我们…