首页 > 其他分享 >P8773 [蓝桥杯 2022 省 A] 选数异或

P8773 [蓝桥杯 2022 省 A] 选数异或

时间:2022-11-07 13:23:03浏览次数:55  
标签:int long 蓝桥 leq 异或 P8773

题面

给定一个长度为 \(n\) 的数列 \(A_{1}, A_{2}, \cdots, A_{n}\) 和一个非负整数 \(x\), 给定 \(m\) 次查询, 每次询问能否从某个区间 \([l, r]\) 中选择两个数使得他们的异或等于 \(x\) 。

对于所有评测用例, \(1 \leq n, m \leq 10^5,0 \leq x<2^{20}, 1 \leq l_{i} \leq r_{i} \leq n\) , \(0 \leq A_{i}<2^{20}\) 。

思路

其实是一个 DP 题。

如果我们设 \(f_i\) 为 \([1,i-1]\) 中存在 \(A_k \operatorname{xor} A_j\) 的 \(\max(j,k)\):

如果设 \(L(i,k)\) 为 \([1,i]\) 中 \(k\) 最后出现的位置,那么动态转移方程就推出来了:

\[f_i=\max(f_{i-1},L(i,A_i\operatorname{xor} x)) \]

\(L\) 用 std::map 实现,可以做到 \(O(n\log n)\)。

最后回答询问的时候,只要判断 \(f_R \leq L\) 即可。因为如果满足 \(f_R\leq L\),那么肯定存在数对。

时间复杂度 \(O(n\log n+q)\)。

代码

#include <bits/stdc++.h>
#define int long long
using namespace std;

int n,m,x;
map<int,int> lst;
int f[100005];
int a[100005];

signed main(){
	cin>>n>>m>>x;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=n;i++){
		lst[a[i]]=i;
		f[i]=max(f[i-1],lst[a[i]^x]);
	}
	while(m--){
		int l,r;
		cin>>l>>r;
		cout<<(f[r]>=l?"yes":"no")<<'\n';
	}
	return 0;
}

标签:int,long,蓝桥,leq,异或,P8773
From: https://www.cnblogs.com/zheyuanxie/p/p8773.html

相关文章

  • P8622 [蓝桥杯 2014 国 B] 生物芯片
    简要题意有\(N\)个二进制数,编号为\(1\simN\),初始时都是\(0\)。博士进行了\(N-1\)次操作,在第\(i\)次操作时,会将\(1\simN\)中所有编号为\(i+1\)的倍数的二进......
  • 洛谷P8757 [蓝桥杯 2021 省 A2] 完美序列 题解
    思路为使描述方便,先令题目描述中的“完美序列”反转(即序列单调递增且每一个数都是上一个数的倍数)。原“完美序列”与反转后的本质相同。先考虑最大长度。显然,当完美序列......
  • 洛谷P8775 [蓝桥杯 2022 省 A] 青蛙过河 题解 贪心+二分答案
    题目链接​​https://www.luogu.com.cn/problem/P8775​​题目大意小青蛙住在一条河边,它想到河对岸的学校去学习。小青蛙打算经过河里的石头跳到对岸。河里的石头排成了一条......
  • P8618 [蓝桥杯 2014 国 B] Log 大侠
    简要题意给你一个长度为\(n\)的正整数序列\(a\),有\(m\)个询问,每一个询问给出一个区间\([l,r]\)。定义函数\(f(x)=\lfloor\log_{2}(x)+1\rfloor\)。将\([l,r]\)的......
  • P8796 [蓝桥杯 2022 国 AC] 替换字符
    题面给定一个仅含小写英文字母的字符串\(s\)和\(m\)次操作,每次操作选择一个区间\([l_i,r_i]\)将\(s\)的该区间中的所有字母\(x_i\)全部替换成字母\(y_i\),问所......
  • 【题解】Luogu P8743 【[蓝桥杯 2021 省 A] 异或数列】
    最近刚好在刷博弈论,看到这道题没有题解,所以刚好来水一发题目链接[蓝桥杯2021省A]异或数列题目描述Alice和Bob正在玩一个异或数列的游戏。初始时,Alice和Bob......
  • JavaScript异或运算
    相关性质任何数和自己做异或运算,结果为0,即a⊕a=0a⊕a=0。任何数和0做异或运算,结果还是自己,即a⊕0=⊕a⊕0=⊕。异或运算中,满足交换律和结合律,也就是a⊕b⊕a=b⊕a⊕......
  • python描述 LeetCode 1486. 数组异或操作
    python描述LeetCode1486.数组异或操作  大家好,我是亓官劼(qíguānjié),在【亓官劼】公众号、GitHub、B站、华为开发者论坛等平台分享一些技术博文,主要包括前端开发、......
  • 两个数按位异或 按位或 按位与的最大值
    and:就是从最高的一位向下找,如果这一位为1的数多于两个就取出这些数,然后再取出的这些数里面继续下一位的一样的处理,我就用递归写的or:这个比较巧妙,也比较暴力,先每个数开一......
  • 异或运算的巧用 → 不用额外的变量,如何交换两个变量的值?
    开心一刻两头奶牛在一起吃草,其中一头(奶牛甲)越吃越慢,一副若有所思的模样,另一头奶牛(奶牛乙)发觉了,开始了对话奶牛乙:搁那合计啥呢?奶牛甲:你帮我合计合计奶牛乙:咋......