F. Equal XOR Segments(异或前缀和+二分)

思路:

首先可以预处理前缀和𝑠快速计算区间异或.

如果整段异或和为0,随便分成两部分都是正确的.

否则我们至少需要分成3段,设整段异或和为 𝑘.

所以我们需要找到一个位置满足 𝑠𝑥⊕𝑠𝑙−1=𝑘 ,然后我们需要在𝑥后面找到一个位置满足 𝑠𝑦⊕𝑠𝑙−1=0.

可以把数字分桶存储然后二分找到符合要求的位置.

代码:

cpp 复制代码
#include<iostream>
#include<cstring>
#include<vector>
#include<map>
using namespace std;
using LL = long long;

int main(){

    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(0);

    int T;
    cin >> T;
    while(T--){
        int n, m;
        cin >> n >> m;
        vector<int> a(n + 1);
        map<int, vector<int> > mp;
        for(int i = 1; i <= n; i++){
            cin >> a[i];
            a[i] ^= a[i - 1];
            mp[a[i]].push_back(i);
        }
        while(m--){
            int l, r;
            cin >> l >> r;
            if ((a[l - 1] ^ a[r]) == 0){
                cout << "YES" << '\n';
                continue;
            }
            auto &v1 = mp[a[r]];
            auto it = lower_bound(v1.begin(), v1.end(), l); // 找到x,a[x] ^ a[l - 1] = k
            if (it == v1.end() || *it >= r){
                cout << "NO" << '\n';
                continue;
            }
            int pos = *it;
            auto &v2 = mp[a[l - 1]];
            auto nit = lower_bound(v2.begin(), v2.end(), pos + 1); // 找到y,a[y] ^ a[l - 1] = 0
            if (nit != v2.end() && *nit < r){
                cout << "YES" << '\n';
            }
            else{
                cout << "NO" << '\n';
            }
        }
        cout << '\n';
    }

}
相关推荐
Ulyanov32 分钟前
Python实现6-DOF刚体仿真器(下)——环境扰动与控制闭环
开发语言·python·算法·系统仿真·雷达电子对抗·导引头
牧以南歌〆1 小时前
数据结构<八>链式队列
c语言·数据结构·算法
Reart1 小时前
Leetcode 188.买卖股票的最佳时机4(718)
后端·算法
2601_950760791 小时前
BCMA:急性髓系白血病免疫治疗的新型可行靶点
人工智能·算法·蛋白
一个初入编程的小白1 小时前
数据结构:队列和栈的相互实现
数据结构
小保CPP1 小时前
OCR C++ Tesseract生成可搜索的pdf
c++·人工智能·ocr·模式识别·光学字符识别
Reart1 小时前
Leetcode 123.买卖股票的最佳时期3(内有随心谈,718)
后端·算法
可编程芯片开发2 小时前
基于RMDCFT算法的天基雷达空间机动目标检测方法MATLAB仿真,对比FRFT和DFT算法
算法
noipp2 小时前
推荐题目:洛谷 B2099 矩阵交换行
线性代数·算法·矩阵
是个西兰花3 小时前
Linux:深入解析Linux线程原理与实现
linux·运维·c++·线程·互斥锁