AcWing 4645. 选数异或

简介: 每日打卡

传送门 AcWing 4645. 选数异或  

image.png

通过读题我们可以知道,给我们一个区间,进行m次询问,每次询问一个区间内是否存在一个两个下标不同的数的异或等于x。因为a^b = x 与 a = b^x是等价的,那我们不妨使用一个数组来记录i前最近一个与当前数ai异或x之后的值相同值的位置。若这个值在给定区间的左边时,则表示区间内并没有符合条件的数值存在。

image.png


若值在区间内则说明存在值能够满足条件。

image.png

即1<i<r,若存在1<last[a^x]<i,则说明存在值满足题目条件。我们还可以使用一个数组s记录最近一个满足条件的下标。若s[r]的值大于等于l则说明最近一个满足条件的值在限定的区间之中。直接看代码可能更加地直观一些。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 100010,M = (1<<20)+10;
int n,m,x;
int last[M],s[N];
int main()
{
    scanf("%d%d%d",&n,&m,&x);
    for(int i = 1;i<=n;i++)
    {
        int a;
        scanf("%d",&a);
        s[i] = max(s[i-1],last[a^x]);
        last[a] = i;
    }
    while(m--)
    {
        int l,r;
        scanf("%d%d",&l,&r);
        if(s[r]>=l) puts("yes");
        else puts("no");
    }
    return 0;
}

image.gif

目录
相关文章
|
3月前
【LeetCode刷题】两数之和、两数相加
【LeetCode刷题】两数之和、两数相加
|
4月前
|
存储 算法 测试技术
|
4月前
|
人工智能 Java C++
leetcode-454:四数相加 II
leetcode-454:四数相加 II
36 1
LeetCode-2043 两数相加题解
LeetCode-2043 两数相加题解
|
Java Python
leetcode每日一题.445:两数相加II
leetcode每日一题.445:两数相加II
76 0
|
算法
LeetCode:454. 四数相加 II
题目描述:给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 <= i, j, k, l < n nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0
leetcode 454 四数相加II
leetcode 454 四数相加II
76 0
leetcode 454 四数相加II