【Luogu】P4462异或序列(莫队)

  题目链接

  观察什么时候x到y之间那一段可以被统计

  xorsum[x-1]^xorsum[y]=k

  xorsum[x-1]=xorsum[y]^k||xorsum[y]=xorsum[x-1]^k

  莫队维护。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
#include<cstdlib>
#include<cmath>
#define maxn 200200
using namespace std;
inline long long read(){
    long long num=0,f=1;
    char ch=getchar();
    while(!isdigit(ch)){
        if(ch==‘-‘)    f=-1;
        ch=getchar();
    }
    while(isdigit(ch)){
        num=num*10+ch-‘0‘;
        ch=getchar();
    }
    return num*f;
}

int blo[maxn];
int xum[maxn];
int sum[maxn];
long long ans[maxn];

struct Que{
    int x,y,id;
    bool operator <(const Que a)const{
        if(blo[x]!=blo[a.x])    return blo[x]<blo[a.x];
        return y<a.y;
    }
}q[maxn];

int main(){
    int n=read(),m=read(),e=read();
    int sqt=sqrt(n);
    for(int i=1;i<=n;++i)    blo[i]=(i-1)/sqt+1;
    for(int i=1;i<=n;++i)    xum[i]=xum[i-1]^read();
    for(int i=1;i<=m;++i)    q[i]=(Que){read(),read(),i};
    sort(q+1,q+m+1);
    int lef=1,rig=0;long long now=0;
    for(int i=1;i<=m;++i){
        while(lef<q[i].x-1){
            sum[xum[lef]]--;
            now-=sum[xum[lef]^e];
            lef++;
        }
        while(lef>q[i].x-1){
            lef--;
            now+=sum[xum[lef]^e];
            sum[xum[lef]]++;
        }
        while(rig<q[i].y){
            rig++;
            now+=sum[xum[rig]^e];
            sum[xum[rig]]++;
        }
        while(rig>q[i].y){
            sum[xum[rig]]--;
            now-=sum[xum[rig]^e];
            rig--;
        }
        ans[q[i].id]=now;
    }
    for(int i=1;i<=m;++i)    printf("%lld\n",ans[i]);
    return 0;
}

原文地址:https://www.cnblogs.com/cellular-automaton/p/8886315.html

时间: 2024-09-29 23:43:31

【Luogu】P4462异或序列(莫队)的相关文章

P4462 [CQOI2018]异或序列 莫队

题意:给定数列 \(a\) 和 \(k\) ,询问区间 \([l,r]\) 中有多少子区间满足异或和为 \(k\). 莫队.我们可以记录前缀异或值 \(a_i\),修改时,贡献为 \(c[a_i\bigoplus k]\) . #include<cstdio> #include<iostream> #include<algorithm> #include<cmath> #include<cstring> #define R register in

CQOI2018异或序列 [莫队]

莫队板子 用于复习 #include <cstdio> #include <cstdlib> #include <algorithm> #include <cmath> #include <cstring> #include <map> #define Sqr(x) ((x)*(x)) using namespace std; const int N = 1e5 + 5; struct Q{ int x, y, id; }q[N];

P4462 [CQOI2018]异或序列 莫队 异或

题目描述 已知一个长度为n的整数数列a_1,a_2,...,a_na1?,a2?,...,an?,给定查询参数l.r,问在a_l,a_{l+1},...,a_ral?,al+1?,...,ar?区间内,有多少子串满足异或和等于k.也就是说,对于所有的x,y (I ≤ x ≤ y ≤ r),能够满足a_x \bigoplus a_{x+1} \bigoplus ... \bigoplus a_y = kax??ax+1??...?ay?=k的x,y有多少组. 输入格式 输入文件第一行,为3个整数n

Bzoj 3809: Gty的二逼妹子序列 莫队,分块

3809: Gty的二逼妹子序列 Time Limit: 35 Sec  Memory Limit: 28 MBSubmit: 868  Solved: 234[Submit][Status][Discuss] Description Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题. 对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b]的妹子的美丽度的种类数. 为了方便,我们规定妹子们的美丽度全都在[1,n]中. 给定一个长度为n(1<=n<=100000)的

【序列莫队】BZOJ2038- [2009国家集训队]小Z的袜子(hose)

[题目大意]给出1-N只袜子的颜色,多次询问L-R中选出一双同色袜子的概率. [思路] 裸莫队.基本的莫队步骤:①分组(每组大小为根号sqrt(n),共sqrt(n)组)②排序(左边界分组,右边界在组内按大小排序)③暴力转移 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using name

4540: [Hnoi2016]序列|莫队+ST表

考虑现在已经知道了[l,r]的答案新添入一个r+1如何更新答案 也就是右端点在r+1处左端点在l..r+1之间的所有的子序列的答案 可以找出l..r中最小的数的位置p,然后p以及p左侧作为左端点的答案就可以直接计算了 考虑左端点在p+1....r+1时对答案的贡献,可以与处理一个前缀和Si表示以i为右端点的所有子序列的答案之和 那么左端点在p+1....r+1时对答案的贡献就是Sr+1?Sp 其他端点移动的做法也同理 为什么我的莫队跑了17s,而网上的其他莫队只需要5s,人傻自带三倍常数QWQ

bzoj 3809 Gty的二逼妹子序列 —— 莫队+分块

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3809 据说一开始应该想到莫队+树状数组,然而我想的却是莫队+权值线段树... 如果用权值线段树,则修改和查询都是 O(logn),总复杂度 O(n√nlogn),艰难...(而且仔细一看空间有点卡?) 看了TJ,才发现权值也可以分块,则查询 O(√n) 但修改 O(1),就可以过咯~ 代码如下: #include<iostream> #include<cstdio> #inc

莫队算法详解和c实现

解析和实现 摘要:        莫队算法是一个对于区间.树或其他结构离线(在线)维护的算法,此算法基于一些基本算法,例如暴力维护,树状数组,分块,最小曼哈顿距离生成树,对其进行揉合从而产生的一个简单易懂且短小好写的算法.此算法在很多情况下可以很轻松的切掉一些复杂而且难写的数据结构问题. 关键词: 程序设计.算法.算法优化,暴力算法,分块算法,最小曼哈顿距离生成树. 背景: 众所周知,在OI竞赛.软件的设计中都会要求我们去处理各种各样的棘手的问题,而这些问题之中,有一大类就是维护问题:比如说对于

BZOJ3052 [wc2013] 糖果公园 【树上莫队】

树上莫队和普通的序列莫队很像,我们把树进行dfs,然后存一个长度为2n的括号序列,就是一个点进去当作左括号,出来当作右括号,然后如果访问从u到v路径,我们可以转化成括号序列的区间,记录x进去的时候编号为f[x],出来时为g[x],然后分类讨论一下(f[u]<f[v]),如果u和v的lca不是u,那么就是从g[u]到f[v],否则就是lca的f到另一个点的f,(可以自己试一下,中间过程没有用的点正好就抵消掉了)这里要注意一下,从g[u]到f[v]的时候我们会少掉lca这个点,特殊处理一下即可,然后