首页 > 其他分享 >ACWING 4645. 选数异或

ACWING 4645. 选数异或

时间:2023-01-09 12:55:41浏览次数:86  
标签:map 下标 int 选数 4645 异或 mp

url:4645. 选数异或 - AcWing题库

题意:

给n个数,再给m次查询,给一个数x

每次询问给一个区间l,r,问是否能从$[l,r]$中选出两个下标不同的数

使得它们的异或值等于x

 

思路:

这题有个异或性质我没想到(

找两个数使得$a[l] ⊕ a[r] = x$

根据异或的交换性来说

式子可以变成:$a[r] ⊕ x = a[l]$

那么我们直接用$a[r] ⊕ x$即可得到$a[l]$

这时候问题就变成了去找离r最近的$a[r] ⊕ x$即可

暴力思路就是先枚举后端点,往前枚举前端点,记录每个点的满足条件的最右边的值

当然这是O2的,肯定不行

用个map即可很好地解决这个问题

每次map都记录一下a[i]的值,并且使得$mp[a[i]] = i$

这样后面用map来寻找值就直接找到的是下标

并且由于是顺序遍历,后面新的值会覆盖旧的值,而新的值的下标一定是优于旧的值的

然后再用map来弄出$a[i]⊕x$的最右端下标,即$mp[a[i]⊕x]$

用个数组g来记录这些值

然后最后接收l和r,比较是否$l <= g[i]$

然后就发现样例都过不去(

因为这里算的是每个$a[i]$对应的最优解

实际上如果[2,3]满足的话,[2,4]是一定满足的

因为是从这个范围选择两个数,其中一个数并不一定要在最右端点

这里的解决方案就是:

在算$b[i]$的时候对$b[i -  1]$取个max,即是:$b[i] = max(b[i - 1],mp[a[i] ⊕ x]])$

这样就保证了后面的值会继承前面的最右下标

代码:

void solve()
{
	map<int,int> mp;
	int x;
	cin >> n >> m >> x;
	vector<int> a(n + 10),b(n + 10);
	for(int i = 1;i <= n;i++) cin >> a[i];
	for(int i = 1;i <= n;i++)
	{
		b[i] = max(mp[a[i]^x],b[i - 1]);
		mp[a[i]] = i;
		
	}
	while(m--)
	{
		int l,r;
		cin >> l >> r;
		if(b[r] >= l) YES;
		else NO;
	}
}

总结:

异或是具有交换性的

所以问是否$x ⊕ y == z$时,就要联想到$z ⊕ y == x$或者$z ⊕ x == y$

看题目要求什么,这种后面有很多询问的,一般的$O(n^2)$算法都能预处理优化成$O(n)$再处理后面的询问

如果一种情况包含另一种情况,考虑用max那个预处理的东西来维护

标签:map,下标,int,选数,4645,异或,mp
From: https://www.cnblogs.com/rickly233/p/17036675.html

相关文章

  • 选数异或
    选数异或给定一个长度为$n$的数列$A_1,A_2,\ldots,A_n$和一个非负整数$x$,给定$m$次查询,每次询问能否从某个区间$[l,r]$中选择两个下标不同的数使得他们的异或等......
  • 4645. 选数异或
    4645.选数异或给定一个长度为n的数列A1,A2,⋅⋅⋅,An和一个非负整数x,给定m次查询,每次询问能否从某个区间[l,r]中选择两个下标不同的数使得他们的异或等于x。......
  • 统计异或值在范围内的数对有多少(01字典树)
    1803.统计异或值在范围内的数对有多少-力扣(Leetcode)题意:   思路:很经典的方法,01字典树,同时在树上多维护一个数据,有多少个节点经过当前节点,记为cnt我们可以......
  • P4551 最长异或路径 : 01tire + 树 + 异或
    题P4551最长异或路径https://www.luogu.com.cn/problem/P4551知识背景01tire树,可以用来查找异或的最大值。经典问题如下。在nums中,哪两个数中异或值最大。解决方法:......
  • 关于异或-异或运算及其应用
    概念异或,是一个数学运算符,英文为exclusiveOR,缩写为xor,应用于逻辑运算异或的数学符号为“⊕”,计算机符号为“xor”  如果a、b两个值不相同,则异或结果为1......
  • P1036 [NOIP2002 普及组] 选数(DFS + 不降原则)
    P1036[NOIP2002普及组]选数题意​ 在n个数里选k个数,有多少中选法,使得选出来的数的和为素数。不能重复选。思路​ n很小,直接爆搜,但是如果不使用不降原则的话,就......
  • 子数组的最大异或和问题
    子数组的最大异或和问题作者:Grey原文地址:博客园:子数组的最大异或和问题CSDN:子数组的最大异或和问题题目描述数组中所有数都异或起来的结果,叫做异或和。给定一个数组......
  • 关于异或和一些运算符
    上课的时候经常摸鱼,连异或都没搞懂,今天看map源码的时候才注意到有一个看不懂的计算符staticfinalinthash(Objectkey){inth;return(key==nul......
  • 异或运算及其应用-查找奇数个数的数字
     异或运算功能很强大。用的得当可以提高算法效率。先说一下异或运算的运算法则:      1. a^b=b^a2.a^b^c=a^(b^c)=(a^b)^c  3.......
  • C#实现简单的异或加密,方便处理
    将本地的mp4和ts文件加密为“dj”文件,无法播放。解密则是将“dj”文件解密为mp4或ts文件。usingSystem;usingSystem.Collections.Generic;usingSystem.IO;usingSy......